home *** CD-ROM | disk | FTP | other *** search
/ Scene 96 / Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso / misc / coding / e_os300b / ex_mxmpl / mxmplay.asm < prev    next >
Encoding:
Assembly Source File  |  1996-11-21  |  60.0 KB  |  3,211 lines

  1. ;// MXM player, (c) '95/96 Niklas Beisert / pascal
  2. .386
  3.  
  4. GETSETINTMODE=2 ;// 1:dpmi, 2:dos, 4:eos
  5. DPMIPSPCODE=1
  6. DOS32CODE=1
  7.  
  8. ;//this is the right place to include the effects include file!
  9. include mxmallfx.inc
  10.  
  11. ;// *************************************************************************
  12. ;// no need to touch anything beyond this point...
  13.  
  14. MXMPLAY_TEXT segment dword public use32 'CODE'
  15. assume cs:MXMPLAY_TEXT
  16.  
  17. copyright db "cubic tiny gus xm player v1.6 (c) '95/96 Niklas Beisert / pascal"
  18.  
  19. include mxmplay.inc
  20.  
  21. USEVOLCOL=(USEVVOL or USEVVOLSLIDE or USEVFVOLSLIDE or USEVVIBRATE or USEVVIBRATO or USEVPAN or USEVPANSLIDE or USEVPORTANOTE)
  22. USEAMIGAFREQ=((USEFREQTAB eq 1) eq 0)
  23. USELINEARFREQ=((USEFREQTAB eq 0) eq 0)
  24. USEBOTHFREQ=(USEAMIGAFREQ and USELINEARFREQ)
  25. GETSETINTMODEMULTI=(GETSETINTMODE ne 1) and (GETSETINTMODE ne 2) and (GETSETINTMODE ne 4)
  26.  
  27. headersize = 750h
  28. mxmheader struc
  29.   hdMXMSig dd ?
  30.   hdNOrders dd ?
  31.   hdOrdLoopStart dd ?
  32.   hdNChannels dd ?
  33.   hdNPatterns dd ?
  34.   hdNInstruments dd ?
  35.   hdIniTempo db ?
  36.   hdIniBPM db ?
  37.   hdOptions dw ?
  38.   hdSampStart dd ?
  39.   hdSampMem8 dd ?
  40.   hdSampMem16 dd ?
  41.   hdPitchMin dd ?
  42.   hdPitchMax dd ?
  43.   hdPanPos db 32 dup (?)
  44.   hdOrderTable db 256 dup (?)
  45.   hdInstrTable dd 128 dup (?)
  46.   hdPatternTable dd 256 dup (?)
  47. mxmheader ends
  48.  
  49. instrument struc
  50.   insNSamples dd ?
  51.   insSamples db 96 dup (?)
  52.   insVolFade dw ?
  53.   insVibType db ?
  54.   insVibSweep db ?
  55.   insVibDepth db ?
  56.   insVibRate db ?
  57.   insVNum db ?
  58.   insVSustain db ?
  59.   insVLoopS db ?
  60.   insVLoopE db ?
  61.   insVEnv dw 24 dup (?)
  62.   insPNum db ?
  63.   insPSustain db ?
  64.   insPLoopS db ?
  65.   insPLoopE db ?
  66.   insPEnv dw 24 dup (?)
  67.   db 46 dup (?)
  68. instrument ends
  69.  
  70. sample struc
  71.   smpGUSStartPos db ?,?,?
  72.   smpGUSLoopPos db ?,?,?
  73.   smpGUSEndPos db ?,?,?
  74.   smpGUSMode db ?
  75.   smpDefVol db ?
  76.   smpDefPan db ?
  77.   smpNormNote dw ?
  78.   db ?,?
  79. sample ends
  80.  
  81.  
  82.  
  83.  
  84. channelsize = 256
  85. channel struc
  86.   chGUSInited db ?
  87.   chGUSStartPos dd ?
  88.   chGUSEndPos dd ?
  89.   chGUSLoopPos dd ?
  90.   chGUSMode db ?
  91.   chGUSStopIt db ?
  92.   chGUSChangeSamp db ?
  93.   chGUSNextPos dd ?
  94.   chGUSFrq dw ?
  95.   chGUSVol dw ?
  96.   chGUSPan db ?
  97.  
  98.   chVol db ?
  99.   chFinalVol db ?
  100.   chPan db ?
  101.   chFinalPan db ?
  102.   chPitch dd ?
  103.   chFinalPitch dd ?
  104.  
  105.   chCurIns db ?
  106.   chEnvIns dd ?
  107.   chCurNormNote dw ?
  108.   chSustain db ?
  109.   chFadeVol dw ?
  110.   chAVibPos db ?
  111.   chAVibSwpPos db ?
  112.   chVolEnvPos dd ?
  113.   chVolEnvSegPos dw ?
  114.   chPanEnvPos dd ?
  115.   chPanEnvSegPos dw ?
  116.  
  117.   chDefVol db ?
  118.   chDefPan db ?
  119.   chCommand db ?
  120.   chVCommand db ?
  121.   chPortaToPitch dd ?
  122.   chPortaToVal dd ?
  123.   chVolSlideVal db ?
  124.   chGVolSlideVal db ?
  125.   chVVolPanSlideVal db ?
  126.   chPanSlideVal db ?
  127.   chFineVolSlideUVal db ?
  128.   chFineVolSlideDVal db ?
  129.   chPortaUVal dd ?
  130.   chPortaDVal dd ?
  131.   chFinePortaUVal db ?
  132.   chFinePortaDVal db ?
  133.   chXFinePortaUVal db ?
  134.   chXFinePortaDVal db ?
  135.   chVibRate db ?
  136.   chVibPos db ?
  137.   chVibType db ?
  138.   chVibDep db ?
  139.   chTremRate db ?
  140.   chTremPos db ?
  141.   chTremType db ?
  142.   chTremDep db ?
  143.   chPatLoopCount db ?
  144.   chPatLoopStart db ?
  145.   chArpPos db ?
  146.   chArpNotes db ?,?,?
  147.   chActionTick db ?
  148.   chMRetrigPos db ?
  149.   chMRetrigLen db ?
  150.   chMRetrigAct db ?
  151.   chDelayNote db ?
  152.   chOffset db ?
  153.   chGlissando db ?
  154.   chTremorPos db ?
  155.   chTremorLen db ?
  156.   chTremorOff db ?
  157. channel ends
  158.  
  159. globaldatastruct struc
  160.   globalvol db ?
  161.   uservol db ?
  162.   syncval db ?
  163.  
  164.   curtick db ?
  165.   curtempo db ?
  166.   tick0 db ?
  167.  
  168.   currow dd ?
  169.   patptr dd ?
  170.   patlen dd ?
  171.  
  172.   curord dd ?
  173.  
  174.   jumptoord dd ?
  175.   jumptorow dd ?
  176.   patdelay db ?
  177.  
  178.   procnot db ?
  179.   procins db ?
  180.   procvol db ?
  181.   proccmd db ?
  182.   procdat db ?
  183.   notedelayed db ?
  184.  
  185.   tmGetSetIntMode db ?
  186.   tmOldTimer df ?
  187.   tmOldSSESP df ?
  188.   tmIntCount dd ?
  189.   tmTimerRate dd ?
  190.   tmTicker dd ?
  191.   tmInRoutine dd ?
  192.   stimerlen dd ?
  193.   stimerpos dd ?
  194.   datasegsel dw ?
  195.   maxtimerrate dd ?
  196.  
  197.   gusport dd ?
  198.   guschannels dd ?
  199.  
  200.   portatmp db ?
  201.   keyofftmp db ?
  202.  
  203.   head db headersize dup (?)
  204.  
  205.   guslinvol dw 257 dup (?)
  206.  
  207.   chandata db (channelsize*32) dup (?)
  208.  
  209.   tmStack db 1024 dup (?)
  210.  
  211.   vibtabs db 1024 dup (?)
  212. globaldatastruct ends
  213.  
  214. globdatptr dd 0
  215.  
  216. ;//*************************************************************************
  217. ;// XM player
  218.  
  219. loadebp proc
  220.   call @@loadebp_getadr
  221. @@loadebp_getadr:
  222.   pop ebp
  223.   mov ebp,cs:[ebp+(globdatptr-@@loadebp_getadr)]
  224.   ret
  225. loadebp endp
  226.  
  227. inittables proc
  228. if USEVIBRATO or USEVVIBRATO or USEAUTOVIBRATO
  229.   call @@inittables_getadr
  230. @@inittables_getadr:
  231.   pop esi
  232.   add esi,sintab-@@inittables_getadr
  233.   lea edi,[ebp].vibtabs
  234.   mov ecx,16
  235.   rep movsd
  236.   mov al,64
  237.   stosb
  238.   mov cl,63
  239. @@inittables_sintabloop1:
  240.     dec esi
  241.     mov al,[esi]
  242.     stosb
  243.   dec cl
  244.   jnz @@inittables_sintabloop1
  245.   lea esi,[ebp].vibtabs
  246.   mov cl,128
  247. @@inittables_sintabloop2:
  248.     lodsb
  249.     neg al
  250.     stosb
  251.   dec cl
  252.   jnz @@inittables_sintabloop2
  253.  
  254. if USEVIBTYPE or USETREMTYPE or USEAUTOVIBRATOTYPE
  255. @@inittables_dwntabloop:
  256.     mov al,cl
  257.     sar al,1
  258.     neg al
  259.     stosb
  260.   dec cl
  261.   jnz @@inittables_dwntabloop
  262.  
  263. @@inittables_rectabloop:
  264.     mov al,cl
  265.     and al,80h
  266.     sub al,40h
  267.     stosb
  268.   dec cl
  269.   jnz @@inittables_rectabloop
  270.  
  271. @@inittables_uptabloop:
  272.     mov al,cl
  273.     sar al,1
  274.     stosb
  275.   dec cl
  276.   jnz @@inittables_uptabloop
  277. endif
  278. endif
  279.  
  280.   mov [ebp].guslinvol[0],0
  281.   mov [ebp].guslinvol[512],0EFFFh
  282.  
  283.   mov edi,1
  284. @@inittables_lintabloop:
  285.     mov ebx,edi
  286.     mov edx,7
  287.   @@inittables_logloop:
  288.     cmp ebx,0
  289.     je @@inittables_logfound
  290.       shr ebx,1
  291.       inc edx
  292.     jmp @@inittables_logloop
  293.   @@inittables_logfound:
  294.     mov eax,edi
  295.     mov cl,20
  296.     sub cl,dl
  297.     shl eax,cl
  298.     and eax,0fffh
  299.     shl edx,12
  300.     or eax,edx
  301.     sub eax,1000h
  302.     mov [ebp].guslinvol[2*edi],ax
  303.   inc edi
  304.   cmp edi,256
  305.   jne @@inittables_lintabloop
  306.  
  307.   ret
  308. inittables endp
  309.  
  310.  
  311. public xmpInit_
  312. xmpInit_ proc ;// esi:mxmdata, ecx:maxtimerrate, eax:gusport, ebx:globdat, edx:getsetintmode
  313.   push ebp
  314.  
  315.   call @@xmpInit_getadr
  316. @@xmpInit_getadr:
  317.   pop ebp
  318.   mov [ebp+(globdatptr-@@xmpInit_getadr)],ebx
  319.   mov ebp,ebx
  320.   mov ebx,4000h
  321. @@xmpInit_inilp:
  322.     dec ebx
  323.     mov byte ptr [ebp+ebx],0
  324.   jnz @@xmpInit_inilp
  325.  
  326. if GETSETINTMODEMULTI
  327.   mov [ebp].tmGetSetIntMode,dl
  328. endif
  329.   mov [ebp].maxtimerrate,ecx
  330.   mov [ebp].uservol,40h
  331.  
  332.   mov [ebp].gusport,eax
  333.  
  334.   cmp [esi].hdMXMSig,004D584Dh
  335.   jne @@xmpInit_fail
  336.  
  337.   lea edi,[ebp].head.hdMXMSig
  338.   mov ecx,headersize/4
  339.   rep movsd
  340.  
  341.   sub esi,headersize
  342.   sub edi,600h
  343.   mov ecx,600h/4
  344. @@xmpInit_relloop:
  345.     add [edi],esi
  346.     add edi,4
  347.   dec ecx
  348.   jnz @@xmpInit_relloop
  349.  
  350. if USEDELTASAMP
  351.   test byte ptr [esi].hdOptions,4
  352.   jz @@xmpInit_nodelta
  353.     and byte ptr [esi].hdOptions,not 4
  354.  
  355.     mov ecx,[esi].hdSampMem8
  356.     mov ebx,[esi].hdSampStart
  357.     add ebx,esi
  358.     xor eax,eax
  359.     cmp ecx,0
  360.     je @@xmpInit_8bitfini
  361.   @@xmpInit_8bitdelta:
  362.       add al,[ebx]
  363.       mov [ebx],al
  364.       inc ebx
  365.     dec ecx
  366.     jnz @@xmpInit_8bitdelta
  367.   @@xmpInit_8bitfini:
  368. if USE16BIT
  369.     mov ecx,[esi].hdSampMem16
  370.     xor eax,eax
  371.     cmp ecx,0
  372.     je @@xmpInit_16bitfini
  373.   @@xmpInit_16bitdelta:
  374.       add ax,[ebx]
  375.       mov [ebx],ax
  376.       add ebx,2
  377.     dec ecx
  378.     jnz @@xmpInit_16bitdelta
  379.   @@xmpInit_16bitfini:
  380. endif
  381. @@xmpInit_nodelta:
  382. endif
  383.  
  384.   mov ecx,[esi].hdSampMem16
  385.   shl ecx,1
  386.   add ecx,[esi].hdSampMem8
  387.   mov eax,[esi].hdSampStart
  388.   add esi,eax
  389.  
  390.   call gusUploadSamples
  391.   call inittables
  392.  
  393.   mov eax,1
  394.   jmp @@xmpInit_done
  395.  
  396. @@xmpInit_fail:
  397.   xor eax,eax
  398. @@xmpInit_done:
  399.  
  400.   pop ebp
  401.   ret
  402. xmpInit_ endp
  403.  
  404.  
  405.  
  406.  
  407.  
  408.  
  409. getfreq6848 proc
  410.   push edx
  411.   push ebx
  412.   push ecx
  413.   push esi
  414.   add eax,8000h
  415.   mov edx,eax
  416.   mov ebx,eax
  417.   mov ecx,eax
  418.   shr eax,12
  419.   shr edx,8
  420.   shr ebx,4
  421.   and eax,15
  422.   and ebx,15
  423.   and ecx,15
  424.   and edx,15
  425.   call @@getfreq6848_getadr
  426. @@getfreq6848_getadr:
  427.   pop esi
  428.   add esi,logfreqtab-@@getfreq6848_getadr
  429.   mov eax,[esi+6*16+eax*4]
  430.   movzx edx,word ptr [esi+4*16+edx*2]
  431.   movzx ebx,word ptr [esi+2*16+ebx*2]
  432.   movzx ecx,word ptr [esi+0*16+ecx*2]
  433.   mul edx
  434.   shrd eax,edx,15
  435.   mul ebx
  436.   shrd eax,edx,15
  437.   mul ecx
  438.   shrd eax,edx,15
  439.   pop esi
  440.   pop ecx
  441.   pop ebx
  442.   pop edx
  443.   ret
  444. getfreq6848 endp
  445.  
  446.  
  447.  
  448.  
  449. PlayNote proc
  450.   mov [ebp].portatmp,0
  451.   mov [ebp].keyofftmp,0
  452.  
  453.   cmp [ebp].proccmd,3
  454.   jne @@PlayNote_noportac
  455.     mov [ebp].portatmp,1
  456. @@PlayNote_noportac:
  457.   cmp [ebp].proccmd,5
  458.   jne @@PlayNote_noportacv
  459.     mov [ebp].portatmp,1
  460. @@PlayNote_noportacv:
  461.   cmp [ebp].procvol,0f0h
  462.   jb @@PlayNote_noportav
  463.     mov [ebp].portatmp,1
  464. @@PlayNote_noportav:
  465.  
  466.   cmp [ebp].proccmd,20
  467.   jne @@PlayNote_nokeycmd
  468.   cmp [ebp].procdat,0
  469.   je @@PlayNote_dokeycmd
  470. @@PlayNote_nokeycmd:
  471.  
  472.   cmp [ebp].procnot,97
  473.   jne @@PlayNote_nokeyoff
  474.     mov [ebp].procnot,0
  475.   @@PlayNote_dokeycmd:
  476.     mov [ebp].keyofftmp,1
  477.     mov [edi].chSustain,0
  478.     ;// if no instrument and no volenv. kill note
  479. @@PlayNote_nokeyoff:
  480.  
  481.   movzx eax,[ebp].procins
  482.   cmp al,0
  483.   je @@PlayNote_noins1
  484.   cmp eax,[ebp].head.hdNInstruments
  485.   ja @@PlayNote_noins1
  486.     mov [edi].chCurIns,al
  487. @@PlayNote_noins1:
  488.   cmp [edi].chCurIns,0
  489.   je @@PlayNote_done
  490.  
  491.   movzx eax,[ebp].procnot
  492.   cmp al,0
  493.   je @@PlayNote_nonote
  494.     cmp [ebp].procins,0
  495.     je @@PlayNote_nohit
  496.       mov [edi].chSustain,1
  497.   @@PlayNote_nohit:
  498.  
  499.     mov [edi].chDelayNote,al
  500.     cmp [ebp].proccmd,49
  501.     jne @@PlayNote_nodelay
  502.       cmp [ebp].procdat,0
  503.       jne @@PlayNote_done
  504.   @@PlayNote_nodelay:
  505.  
  506.     dec al
  507.     cmp [ebp].portatmp,1
  508.     je @@PlayNote_portanote
  509.       mov [edi].chGUSStopIt,1
  510.  
  511.       movzx edx,[edi].chCurIns
  512.       mov edx,[ebp].head.hdInstrTable[4*edx-4]
  513.       movzx ebx,insSamples[edx][eax]
  514.       cmp ebx,insNSamples[edx]
  515.       jae @@PlayNote_done
  516.       shl ebx,4
  517.       lea ebx,[ebx+edx+256]
  518.  
  519.       mov [edi].chGUSInited,1
  520.       mov [edi].chGUSChangeSamp,1
  521.  
  522.       push eax
  523.       mov eax,dword ptr [ebx].smpGUSStartPos
  524.       and eax,0ffffffh
  525.       mov [edi].chGUSStartPos,eax
  526.       mov eax,dword ptr [ebx].smpGUSLoopPos
  527.       and eax,0ffffffh
  528.       mov [edi].chGUSLoopPos,eax
  529.       mov eax,dword ptr [ebx].smpGUSEndPos
  530.       and eax,0ffffffh
  531.       mov [edi].chGUSEndPos,eax
  532.       mov al,[ebx].smpGUSMode
  533.       mov [edi].chGUSMode,al
  534.       pop eax
  535.  
  536.       cmp [ebp].procins,0
  537.       je @@PlayNote_noins2
  538.         mov [edi].chEnvIns,edx
  539.         mov dl,[ebx].smpDefVol
  540.         mov [edi].chDefVol,dl
  541.         mov dl,[ebx].smpDefPan
  542.         mov [edi].chDefPan,dl
  543.     @@PlayNote_noins2:
  544.  
  545.       mov dx,[ebx].smpNormNote
  546.       mov [edi].chCurNormNote,dx
  547.  
  548. ;// process finetune here (proccmd==41)
  549. ;// overwrite top 4 bits of instrument finetune value
  550. ;// cannot do this correctly, since conversion reduced information... :(
  551. ;// this command sucks anyway!!!
  552.  
  553.       shl eax,8
  554.       add ax,dx
  555.       neg ax
  556.       add ah,48
  557.       movsx eax,ax
  558. if USEBOTHFREQ
  559.       test byte ptr [ebp].head.hdOptions,1
  560.       jnz @@PlayNote_noamiga1
  561. endif
  562. if USEAMIGAFREQ
  563.         neg eax
  564.         call getfreq6848
  565.     @@PlayNote_noamiga1:
  566. endif
  567.       mov [edi].chPitch,eax
  568.       mov [edi].chFinalPitch,eax
  569.       mov [edi].chPortaToPitch,eax
  570.  
  571.       xor eax,eax
  572. if USEOFFSET
  573.       cmp [ebp].proccmd,9
  574.       jne @@PlayNote_nooffset
  575.         mov al,[ebp].procdat
  576.         cmp al,0
  577.         je @@PlayNote_reuseoffset
  578.           mov [edi].chOffset,al
  579.       @@PlayNote_reuseoffset:
  580.         movzx eax,[edi].chOffset
  581.         shl eax,8
  582.     @@PlayNote_nooffset:
  583. endif
  584.  
  585.       mov [edi].chGUSNextPos,eax
  586.       mov [edi].chVibPos,0
  587.       mov [edi].chTremPos,0
  588.       mov [edi].chArpPos,0
  589.       mov [edi].chMRetrigPos,0
  590.       mov [edi].chTremorPos,0
  591.       jmp @@PlayNote_nonote
  592.  
  593.   @@PlayNote_portanote:
  594.       shl eax,8
  595.       add ax,[edi].chCurNormNote
  596.       neg ax
  597.       add ah,48
  598.       movsx eax,ax
  599. if USEBOTHFREQ
  600.       test byte ptr [ebp].head.hdOptions,1
  601.       jnz @@PlayNote_noamiga2
  602. endif
  603. if USEAMIGAFREQ
  604.         neg eax
  605.         call getfreq6848
  606.     @@PlayNote_noamiga2:
  607. endif
  608.       mov [edi].chPortaToPitch,eax
  609. @@PlayNote_nonote:
  610.  
  611.   cmp [edi].chSustain,0
  612.   je @@PlayNote_killbug
  613.   cmp [ebp].procins,0
  614.   je @@PlayNote_killbug
  615.     cmp [ebp].notedelayed,1
  616.     je @@PlayNote_noinsvolpan
  617.       mov al,[edi].chDefVol
  618.       mov [edi].chVol,al
  619.       mov [edi].chFinalVol,al
  620.       test byte ptr [ebp].head.hdOptions,2
  621.       jnz @@PlayNote_noinsvolpan
  622.       mov al,[edi].chDefPan
  623.       mov [edi].chPan,al
  624.       mov [edi].chFinalPan,al
  625.   @@PlayNote_noinsvolpan:
  626.     xor eax,eax
  627.     mov [edi].chFadeVol,8000h
  628.     mov [edi].chAVibPos,al
  629.     mov [edi].chAVibSwpPos,al
  630.     mov [edi].chVolEnvPos,eax
  631.     mov [edi].chVolEnvSegPos,ax
  632.     mov [edi].chPanEnvPos,eax
  633.     mov [edi].chPanEnvSegPos,ax
  634.  
  635. @@PlayNote_killbug:
  636.   cmp [ebp].keyofftmp,0
  637.   je @@PlayNote_done
  638.   cmp [ebp].procins,0
  639.   jne @@PlayNote_done
  640.   mov ebx,[edi].chEnvIns
  641.   cmp [ebx].insVNum,0
  642.   jne @@PlayNote_done
  643.     mov [edi].chFadeVol,0
  644.  
  645. @@PlayNote_done:
  646.   ret
  647. PlayNote endp
  648.  
  649. public xmpSetVolume_
  650. xmpSetVolume_ proc
  651.   push ebp
  652.   call loadebp
  653.   mov [ebp].uservol,al
  654.   pop ebp
  655.   ret
  656. xmpSetVolume_ endp
  657.  
  658. public xmpGetSync_
  659. xmpGetSync_ proc
  660.   push ebp
  661.   call loadebp
  662.   mov al,[ebp].syncval
  663.   pop ebp
  664.   ret
  665. xmpGetSync_ endp
  666.  
  667. public xmpGetPos_
  668. xmpGetPos_ proc
  669.   push ebp
  670.   call loadebp
  671.   mov al,byte ptr [ebp].currow
  672.   mov ah,byte ptr [ebp].curord
  673.   pop ebp
  674.   ret
  675. xmpGetPos_ endp
  676.  
  677.  
  678.  
  679.  
  680. freqrange proc
  681.   cmp eax,[ebp].head.hdPitchMin
  682.   jg @@freqrange_lowlimok
  683.     mov eax,[ebp].head.hdPitchMin
  684. @@freqrange_lowlimok:
  685.   cmp eax,[ebp].head.hdPitchMax
  686.   jl @@freqrange_highlimok
  687.     mov eax,[ebp].head.hdPitchMax
  688. @@freqrange_highlimok:
  689.   ret
  690. freqrange endp
  691.  
  692.  
  693. ;//***************************************************************************
  694. ;//effects
  695.  
  696. procnothing proc
  697.   ret
  698. procnothing endp
  699.  
  700. if USEJUMP
  701. procjump proc
  702.   movzx eax,[ebp].procdat
  703.   mov [ebp].jumptoord,eax
  704.   mov [ebp].jumptorow,0
  705.   ret
  706. procjump endp
  707. else
  708.   procjump=procnothing
  709. endif
  710.  
  711. if USEBREAK
  712. procbreak proc
  713.   cmp [ebp].jumptoord,-1
  714.   jne @@procbreak_onlyrow
  715.     mov eax,[ebp].curord
  716.     inc eax
  717.     mov [ebp].jumptoord,eax
  718. @@procbreak_onlyrow:
  719.   movzx eax,[ebp].procdat
  720.   mov ebx,eax
  721.   shr al,4
  722.   imul eax,10
  723.   and bl,0fh
  724.   add eax,ebx
  725.   mov [ebp].jumptorow,eax
  726.   ret
  727. procbreak endp
  728. else
  729.   procbreak=procnothing
  730. endif
  731.  
  732. if USEPATLOOP
  733. procpatloop proc
  734.   mov al,[ebp].procdat
  735.   cmp al,0
  736.   je @@procpatloop_set
  737.     inc [edi].chPatLoopCount
  738.     cmp [edi].chPatLoopCount,al
  739.     ja @@procpatloop_nextrow
  740.       movzx eax,[edi].chPatLoopStart
  741.       mov [ebp].jumptorow,eax
  742.       mov eax,[ebp].curord
  743.       mov [ebp].jumptoord,eax
  744.     jmp @@procpatloop_done
  745.   @@procpatloop_nextrow:
  746.       mov [edi].chPatLoopCount,0
  747.       mov al,byte ptr [ebp].currow
  748.       inc al
  749.       mov [edi].chPatLoopStart,al
  750.     jmp @@procpatloop_done
  751. @@procpatloop_set:
  752.   mov al,byte ptr [ebp].currow
  753.   mov [edi].chPatLoopStart,al
  754. @@procpatloop_done:
  755.   ret
  756. procpatloop endp
  757. else
  758.   procpatloop=procnothing
  759. endif
  760.  
  761. if USEPATDELAY
  762. procpatdelay proc
  763.   mov al,[ebp].procdat
  764.   mov [ebp].patdelay,al
  765.   ret
  766. procpatdelay endp
  767. else
  768.   procpatdelay=procnothing
  769. endif
  770.  
  771. if USESPEED
  772. proctempo proc
  773.   movzx ebx,[ebp].procdat
  774.   cmp bl,20h
  775.   jb @@proctempo_speed
  776.     mov eax,2983615
  777.     xor edx,edx
  778.     div ebx
  779.     mov [ebp].stimerlen,eax
  780.     ret
  781. @@proctempo_speed:
  782.     cmp bl,0
  783.     je @@proctempo_ignore
  784.     mov [ebp].curtempo,bl
  785. @@proctempo_ignore:
  786.   ret
  787. proctempo endp
  788. else
  789.   proctempo=procnothing
  790. endif
  791.  
  792. if USEVOL
  793. procnvol proc
  794.   mov al,[ebp].procdat
  795.   cmp al,40h
  796.   jbe @@procnvol_vok
  797.     mov al,40h
  798. @@procnvol_vok:
  799.   mov [edi].chVol,al
  800.   mov [edi].chFinalVol,al
  801.   ret
  802. procnvol endp
  803. else
  804.   procnvol=procnothing
  805. endif
  806.  
  807. if USEGVOL
  808. procgvol proc
  809.   mov al,[ebp].procdat
  810.   cmp al,40h
  811.   jbe @@procgvol_vok
  812.     mov al,40h
  813. @@procgvol_vok:
  814.   mov [ebp].globalvol,al
  815.   ret
  816. procgvol endp
  817. else
  818.   procgvol=procnothing
  819. endif
  820.  
  821. if USEPAN
  822. procpan proc
  823.   mov al,[ebp].procdat
  824.   mov [edi].chPan,al
  825.   mov [edi].chFinalPan,al
  826.   ret
  827. procpan endp
  828. else
  829.   procpan=procnothing
  830. endif
  831.  
  832. if USESPAN
  833. procspan proc
  834.   mov al,[ebp].procdat
  835.   shl al,4
  836.   or al,[ebp].procdat
  837.   mov [edi].chPan,al
  838.   mov [edi].chFinalPan,al
  839.   ret
  840. procspan endp
  841. else
  842.   procspan=procnothing
  843. endif
  844.  
  845. if USEVPAN
  846. procvpan proc
  847.   mov al,[ebp].procvol
  848.   shl al,4
  849.   or al,[ebp].procvol
  850.   mov [edi].chPan,al
  851.   mov [edi].chFinalPan,al
  852.   ret
  853. procvpan endp
  854. else
  855.   procvpan=procnothing
  856. endif
  857.  
  858. if USEARPEGGIO
  859. procarpeggio proc
  860.   movzx eax,[ebp].procdat
  861.   cmp al,0
  862.   jne @@procarpeggio_doit
  863.     mov [edi].chCommand,0ffh
  864. @@procarpeggio_doit:
  865.   shl eax,4
  866.   shr al,4
  867.   mov [edi].chArpNotes[0],0
  868.   mov [edi].chArpNotes[1],ah
  869.   mov [edi].chArpNotes[2],al
  870.   ret
  871. procarpeggio endp
  872.  
  873. doarpeggio proc
  874.   movzx eax,[edi].chArpPos
  875.   mov al,[edi].chArpNotes[eax]
  876. if USEBOTHFREQ
  877.   test byte ptr [ebp].head.hdOptions,1
  878.   jz @@doarpeggio_amiga
  879. endif
  880. if USELINEARFREQ
  881.     shl eax,8
  882.     neg eax
  883.     add eax,[edi].chFinalPitch
  884.     call freqrange
  885.     mov [edi].chFinalPitch,eax
  886. endif
  887. if USEBOTHFREQ
  888.   jmp @@doarpeggio_noamiga
  889. endif
  890. if USEAMIGAFREQ
  891. @@doarpeggio_amiga:
  892.     call @@doarpeggio_getadr
  893.   @@doarpeggio_getadr:
  894.     pop edx
  895.     mov ax,[edx+eax*2+16*4+(logfreqtab-@@doarpeggio_getadr)]
  896.     mul [edi].chFinalPitch
  897.     shrd eax,edx,15
  898.     call freqrange
  899.     mov [edi].chFinalPitch,eax
  900. endif
  901.  
  902. @@doarpeggio_noamiga:
  903.   inc [edi].chArpPos
  904.   cmp [edi].chArpPos,3
  905.   jne @@doarpeggio_done
  906.     mov [edi].chArpPos,0
  907. @@doarpeggio_done:
  908.   ret
  909. doarpeggio endp
  910. else
  911.   procarpeggio=procnothing
  912.   doarpeggio=procnothing
  913. endif
  914.  
  915.  
  916.  
  917. if USETREMTYPE and USETREMOLO
  918. proctremtype proc
  919.   mov al,[ebp].procdat
  920.   and al,3
  921.   mov [edi].chTremType,al
  922.   ret
  923. proctremtype endp
  924. else
  925.   proctremtype=procnothing
  926. endif
  927.  
  928. if USETREMOLO
  929. proctremolo proc
  930.   mov al,[ebp].procdat
  931.   and al,0Fh
  932.   jz @@proctremolo_reusel
  933.     shl al,2
  934.     mov [edi].chTremDep,al
  935. @@proctremolo_reusel:
  936.   mov al,[ebp].procdat
  937.   and al,0F0h
  938.   jz @@proctremolo_reuseh
  939.     shr al,2
  940.     mov [edi].chTremRate,al
  941. @@proctremolo_reuseh:
  942.   ret
  943. proctremolo endp
  944.  
  945. dotremolo proc
  946.   movzx eax,word ptr [edi].chTremPos
  947.   movsx eax,[ebp].vibtabs[eax]
  948.   imul [edi].chTremDep
  949.   sar eax,6
  950.   add al,[edi].chFinalVol
  951.   jns @@dotremolo_lok
  952.     mov al,0
  953. @@dotremolo_lok:
  954.   cmp al,40h
  955.   jbe @@dotremolo_tok
  956.     mov al,40h
  957. @@dotremolo_tok:
  958.   mov [edi].chFinalVol,al
  959.  
  960.   cmp [ebp].tick0,0
  961.   jne @@dotremolo_done
  962.   mov al,[edi].chTremRate
  963.   add [edi].chTremPos,al
  964. @@dotremolo_done:
  965.   ret
  966. dotremolo endp
  967. else
  968.   proctremolo=procnothing
  969.   dotremolo=procnothing
  970. endif
  971.  
  972.  
  973.  
  974.  
  975.  
  976. if USEFPORTA
  977. procfportau proc
  978.   mov al,[ebp].procdat
  979.   cmp al,0
  980.   je @@procfportau_reuse
  981.     mov [edi].chFinePortaUVal,al
  982. @@procfportau_reuse:
  983.   movzx eax,[edi].chFinePortaUVal
  984.   shl eax,4
  985.   neg eax
  986.   add eax,[edi].chPitch
  987.   call freqrange
  988.   mov [edi].chPitch,eax
  989.   mov [edi].chFinalPitch,eax
  990.   ret
  991. procfportau endp
  992.  
  993. procfportad proc
  994.   mov al,[ebp].procdat
  995.   cmp al,0
  996.   je @@procfportad_reuse
  997.     mov [edi].chFinePortaDVal,al
  998. @@procfportad_reuse:
  999.   movzx eax,[edi].chFinePortaDVal
  1000.   shl eax,4
  1001.   add eax,[edi].chPitch
  1002.   call freqrange
  1003.   mov [edi].chPitch,eax
  1004.   mov [edi].chFinalPitch,eax
  1005.   ret
  1006. procfportad endp
  1007. else
  1008.   procfportau=procnothing
  1009.   procfportad=procnothing
  1010. endif
  1011.  
  1012.  
  1013. if USEXFPORTA
  1014. procxfporta proc
  1015.   movzx eax,[ebp].procdat
  1016.   shl eax,4
  1017.   shr al,4
  1018.   cmp ah,2
  1019.   je @@procxfporta_down
  1020.   cmp ah,1
  1021.   jne @@procxfporta_done
  1022.  
  1023.     cmp al,0
  1024.     je @@procxfporta_reuseu
  1025.       mov [edi].chXFinePortaUVal,al
  1026.   @@procxfporta_reuseu:
  1027.     movzx eax,[edi].chXFinePortaUVal
  1028.     shl eax,2
  1029.     neg eax
  1030.     add eax,[edi].chPitch
  1031.     call freqrange
  1032.     mov [edi].chPitch,eax
  1033.     mov [edi].chFinalPitch,eax
  1034.   jmp @@procxfporta_done
  1035.  
  1036. @@procxfporta_down:
  1037.     cmp al,0
  1038.     je @@procxfporta_reused
  1039.       mov [edi].chXFinePortaDVal,al
  1040.   @@procxfporta_reused:
  1041.     movzx eax,[edi].chXFinePortaDVal
  1042.     shl eax,2
  1043.     add eax,[edi].chPitch
  1044.     call freqrange
  1045.     mov [edi].chPitch,eax
  1046.     mov [edi].chFinalPitch,eax
  1047.  
  1048. @@procxfporta_done:
  1049.   ret
  1050. procxfporta endp
  1051. else
  1052.   procxfporta=procnothing
  1053. endif
  1054.  
  1055.  
  1056. if USEFVOLSLIDE
  1057. procfvolup proc
  1058.   mov al,[ebp].procdat
  1059.   cmp al,0
  1060.   je @@procfvolup_reuse
  1061.     mov [edi].chFineVolSlideUVal,al
  1062. @@procfvolup_reuse:
  1063.   mov al,[edi].chVol
  1064.   add al,[edi].chFineVolSlideUVal
  1065.   cmp al,40h
  1066.   jbe @@procfvolup_vok
  1067.     mov al,40h
  1068. @@procfvolup_vok:
  1069.   mov [edi].chVol,al
  1070.   mov [edi].chFinalVol,al
  1071.   ret
  1072. procfvolup endp
  1073.  
  1074. procfvoldn proc
  1075.   mov al,[ebp].procdat
  1076.   cmp al,0
  1077.   je @@procfvoldn_reuse
  1078.     mov [edi].chFineVolSlideDVal,al
  1079. @@procfvoldn_reuse:
  1080.   mov al,[edi].chVol
  1081.   sub al,[edi].chFineVolSlideDVal
  1082.   jnc @@procfvoldn_vok
  1083.     mov al,0
  1084. @@procfvoldn_vok:
  1085.   mov [edi].chVol,al
  1086.   mov [edi].chFinalVol,al
  1087.   ret
  1088. procfvoldn endp
  1089. else
  1090.   procfvolup=procnothing
  1091.   procfvoldn=procnothing
  1092. endif
  1093.  
  1094. if USEVVOL
  1095. procvvol proc
  1096. procvvol4:
  1097.   mov [ebp].procvol,10h
  1098. procvvol3:
  1099.   add [ebp].procvol,10h
  1100. procvvol2:
  1101.   add [ebp].procvol,10h
  1102. procvvol1:
  1103.   add [ebp].procvol,10h
  1104. procvvol0:
  1105.   mov al,[ebp].procvol
  1106.   mov [edi].chVol,al
  1107.   mov [edi].chFinalVol,al
  1108.   ret
  1109. procvvol endp
  1110. else
  1111.   procvvol0=procnothing
  1112.   procvvol1=procnothing
  1113.   procvvol2=procnothing
  1114.   procvvol3=procnothing
  1115.   procvvol4=procnothing
  1116. endif
  1117.  
  1118. if USEVPANSLIDE or USEVVOLSLIDE
  1119. procvvpsl proc
  1120.   mov al,[ebp].procvol
  1121.   mov [edi].chVVolPanSlideVal,al
  1122.   ret
  1123. procvvpsl endp
  1124. else
  1125.   procvvpsl=procnothing
  1126. endif
  1127.  
  1128. if USEVVOLSLIDE
  1129. dovvolsld proc
  1130.   mov al,[edi].chVol
  1131.   cmp [ebp].tick0,0
  1132.   jne @@dovvolsld_done
  1133.   sub al,[edi].chVVolPanSlideVal
  1134.   jnc @@dovvolsld_done
  1135.     mov al,0
  1136. @@dovvolsld_done:
  1137.   mov [edi].chVol,al
  1138.   mov [edi].chFinalVol,al
  1139.   ret
  1140. dovvolsld endp
  1141.  
  1142. dovvolslu proc
  1143.   mov al,[edi].chVol
  1144.   cmp [ebp].tick0,0
  1145.   jne @@dovvolslu_done
  1146.   add al,[edi].chVVolPanSlideVal
  1147.   cmp al,40h
  1148.   jbe @@dovvolslu_done
  1149.     mov al,40h
  1150. @@dovvolslu_done:
  1151.   mov [edi].chVol,al
  1152.   mov [edi].chFinalVol,al
  1153.   ret
  1154. dovvolslu endp
  1155. else
  1156.   dovvolsld=procnothing
  1157.   dovvolslu=procnothing
  1158. endif
  1159.  
  1160. if USEVPANSLIDE
  1161. dovpansll proc
  1162.   mov al,[edi].chPan
  1163.   cmp [ebp].tick0,0
  1164.   jne @@dovpansll_done
  1165.   sub al,[edi].chVVolPanSlideVal
  1166.   jnc @@dovpansll_done
  1167.     mov al,0
  1168. @@dovpansll_done:
  1169.   mov [edi].chPan,al
  1170.   mov [edi].chFinalPan,al
  1171.   ret
  1172. dovpansll endp
  1173.  
  1174. dovpanslr proc
  1175.   mov al,[edi].chVol
  1176.   cmp [ebp].tick0,0
  1177.   jne @@dovpanslr_done
  1178.   add al,[edi].chVVolPanSlideVal
  1179.   jnc @@dovpanslr_done
  1180.     mov al,0ffh
  1181. @@dovpanslr_done:
  1182.   mov [edi].chPan,al
  1183.   mov [edi].chFinalPan,al
  1184.   ret
  1185. dovpanslr endp
  1186. else
  1187.   dovpansll=procnothing
  1188.   dovpanslr=procnothing
  1189. endif
  1190.  
  1191. if USEVFVOLSLIDE
  1192. procvfvolup proc
  1193.   mov al,[edi].chVol
  1194.   add al,[ebp].procvol
  1195.   cmp al,40h
  1196.   jbe @@procvfvolup_vok
  1197.     mov al,40h
  1198. @@procvfvolup_vok:
  1199.   mov [edi].chVol,al
  1200.   mov [edi].chFinalVol,al
  1201.   ret
  1202. procvfvolup endp
  1203.  
  1204. procvfvoldn proc
  1205.   mov al,[edi].chVol
  1206.   sub al,[ebp].procvol
  1207.   jnc @@procvfvoldn_vok
  1208.     mov al,0
  1209. @@procvfvoldn_vok:
  1210.   mov [edi].chVol,al
  1211.   mov [edi].chFinalVol,al
  1212.   ret
  1213. procvfvoldn endp
  1214. else
  1215.   procvfvolup=procnothing
  1216.   procvfvoldn=procnothing
  1217. endif
  1218.  
  1219. if USESYNC
  1220. procsync proc
  1221.   mov al,[ebp].procdat
  1222.   mov [ebp].syncval,al
  1223.   ret
  1224. procsync endp
  1225. else
  1226.   procsync=procnothing
  1227. endif
  1228.  
  1229.  
  1230. if USETREMOR
  1231. proctremor proc
  1232.   movzx eax,[ebp].procdat
  1233.   cmp al,0
  1234.   je @@proctremor_reuse
  1235.     shl eax,4
  1236.     shr al,4
  1237.     inc al
  1238.     inc ah
  1239.     add al,ah
  1240.     mov [edi].chTremorLen,al
  1241.     mov [edi].chTremorOff,ah
  1242.     mov [edi].chTremorPos,0
  1243. @@proctremor_reuse:
  1244.   ret
  1245. proctremor endp
  1246.  
  1247. dotremor proc
  1248.   mov al,[edi].chTremorPos
  1249.   cmp al,[edi].chTremorOff
  1250.   jb @@dotremor_on
  1251.     mov [edi].chFinalVol,0
  1252. @@dotremor_on:
  1253.   cmp [ebp].tick0,0
  1254.   jne @@dotremor_done
  1255.   mov al,[edi].chTremorPos
  1256.   inc al
  1257.   cmp al,[edi].chTremorLen
  1258.   jb @@dotremor_noloop
  1259.     xor al,al
  1260. @@dotremor_noloop:
  1261.   mov [edi].chTremorPos,al
  1262. @@dotremor_done:
  1263.   ret
  1264. dotremor endp
  1265. else
  1266.   proctremor=procnothing
  1267.   dotremor=procnothing
  1268. endif
  1269.  
  1270.  
  1271.  
  1272. if USEENVPOS
  1273. procenvpos proc
  1274.   cmp [edi].chEnvIns,0
  1275.   je @@procenvpos_noenvins
  1276.   mov ebx,[edi].chEnvIns
  1277.  
  1278.   xor eax,eax
  1279.   movzx edx,[ebp].procdat
  1280.   jmp @@procenvpos_venvloops
  1281. @@procenvpos_venvloop:
  1282.     sub dx,[ebx].insVEnv[4*eax]
  1283.     jb @@procenvpos_venvok
  1284.     inc eax
  1285. @@procenvpos_venvloops:
  1286.   cmp al,[ebx].insVNum
  1287.   jne @@procenvpos_venvloop
  1288.   xor edx,edx
  1289.   sub dx,[ebx].insVEnv[4*eax]
  1290. @@procenvpos_venvok:
  1291.   add dx,[ebx].insVEnv[4*eax]
  1292.   mov [edi].chVolEnvPos,eax
  1293.   mov [edi].chVolEnvSegPos,dx
  1294.  
  1295.   xor eax,eax
  1296.   movzx edx,[ebp].procdat
  1297.   jmp @@procenvpos_penvloops
  1298. @@procenvpos_penvloop:
  1299.     sub dx,[ebx].insPEnv[4*eax]
  1300.     jb @@procenvpos_penvok
  1301.     inc eax
  1302. @@procenvpos_penvloops:
  1303.   cmp al,[ebx].insPNum
  1304.   jne @@procenvpos_venvloop
  1305.   xor edx,edx
  1306.   sub dx,[ebx].insPEnv[4*eax]
  1307. @@procenvpos_penvok:
  1308.   add dx,[ebx].insPEnv[4*eax]
  1309.   mov [edi].chPanEnvPos,eax
  1310.   mov [edi].chPanEnvSegPos,dx
  1311.  
  1312. @@procenvpos_noenvins:
  1313.   ret
  1314. procenvpos endp
  1315. else
  1316.   procenvpos=procnothing
  1317. endif
  1318.  
  1319.  
  1320.  
  1321.  
  1322. if USEPORTA
  1323. procportau proc
  1324.   movzx eax,[ebp].procdat
  1325.   cmp al,0
  1326.   je @@procportau_reuse
  1327.     shl eax,4
  1328.     mov [edi].chPortaUVal,eax
  1329. @@procportau_reuse:
  1330.   ret
  1331. procportau endp
  1332.  
  1333. procportad proc
  1334.   movzx eax,[ebp].procdat
  1335.   cmp al,0
  1336.   je @@procportad_reuse
  1337.     shl eax,4
  1338.     mov [edi].chPortaDVal,eax
  1339. @@procportad_reuse:
  1340.   ret
  1341. procportad endp
  1342.  
  1343. doportau proc
  1344.   cmp [ebp].tick0,0
  1345.   jne @@doportau_done
  1346.   mov eax,[edi].chPitch
  1347.   sub eax,[edi].chPortaUVal
  1348.   call freqrange
  1349.   mov [edi].chPitch,eax
  1350.   mov [edi].chFinalPitch,eax
  1351. @@doportau_done:
  1352.   ret
  1353. doportau endp
  1354.  
  1355. doportad proc
  1356.   cmp [ebp].tick0,0
  1357.   jne @@doportad_done
  1358.   mov eax,[edi].chPitch
  1359.   add eax,[edi].chPortaDVal
  1360.   call freqrange
  1361.   mov [edi].chPitch,eax
  1362.   mov [edi].chFinalPitch,eax
  1363. @@doportad_done:
  1364.   ret
  1365. doportad endp
  1366. else
  1367.   procportau=procnothing
  1368.   procportad=procnothing
  1369.   doportau=procnothing
  1370.   doportad=procnothing
  1371. endif
  1372.  
  1373. if USEPORTANOTE
  1374. procportanote proc
  1375.   movzx eax,[ebp].procdat
  1376.   cmp al,0
  1377.   je @@procportanote_reuse
  1378.     shl eax,4
  1379.     mov [edi].chPortaToVal,eax
  1380. @@procportanote_reuse:
  1381.   ret
  1382. procportanote endp
  1383. else
  1384.   procportanote=procnothing
  1385. endif
  1386.  
  1387. if USEVPORTANOTE
  1388. procvportanote proc
  1389.   movzx eax,[ebp].procvol
  1390.   cmp al,0
  1391.   je @@procvportanote_reuse
  1392.     shl eax,8
  1393.     mov [edi].chPortaToVal,eax
  1394. @@procvportanote_reuse:
  1395.   ret
  1396. procvportanote endp
  1397. else
  1398.   procvportanote=procnothing
  1399. endif
  1400.  
  1401.  
  1402. if USEGLISSANDO and (USEPORTANOTE or USEVPORTANOTE)
  1403. procgliss proc
  1404.   mov al,[ebp].procdat
  1405.   mov [edi].chGlissando,al
  1406.   ret
  1407. procgliss endp
  1408. else
  1409.   procgliss=procnothing
  1410. endif
  1411.  
  1412. if USEPORTANOTE or USEVPORTANOTE
  1413. doportanote proc
  1414.   mov eax,[edi].chPitch
  1415.   cmp [ebp].tick0,0
  1416.   jne @@doportanote_set
  1417.   cmp eax,[edi].chPortaToPitch
  1418.   je @@doportanote_set
  1419.   jg @@doportanote_down
  1420.     add eax,[edi].chPortaToVal
  1421.     cmp eax,[edi].chPortaToPitch
  1422.     jle @@doportanote_set
  1423.     mov eax,[edi].chPortaToPitch
  1424.     jmp @@doportanote_set
  1425. @@doportanote_down:
  1426.     sub eax,[edi].chPortaToVal
  1427.     cmp eax,[edi].chPortaToPitch
  1428.     jge @@doportanote_set
  1429.     mov eax,[edi].chPortaToPitch
  1430. @@doportanote_set:
  1431.   mov [edi].chPitch,eax
  1432.  
  1433. if USEGLISSANDO
  1434.   cmp [edi].chGlissando,0
  1435.   je @@doportanote_setfinpitch
  1436. if USEBOTHFREQ
  1437.     test byte ptr [ebp].head.hdOptions,1
  1438.     jz @@doportanote_amiga
  1439. endif
  1440. if USELINEARFREQ
  1441.       movzx ebx,[edi].chCurNormNote
  1442.       add eax,ebx
  1443.       add eax,80h
  1444.       xor al,al
  1445.       sub eax,ebx
  1446. endif
  1447. if USEBOTHFREQ
  1448.       jmp @@doportanote_setfinpitch
  1449. endif
  1450. if USEAMIGAFREQ
  1451.   @@doportanote_amiga:
  1452.       mov edx,eax ;// search for closest note
  1453.       mov ebx,eax ;// how should i do it??
  1454.       push ecx
  1455.       mov ecx,-1
  1456.       mov eax,-48*256
  1457.     @@doportanote_aloop:
  1458.         push eax
  1459.         add ax,[edi].chCurNormNote
  1460.         movsx eax,ax
  1461.         call getfreq6848
  1462.         sub eax,edx
  1463.         jae @@doportanote_apos
  1464.           neg eax
  1465.       @@doportanote_apos:
  1466.         cmp eax,ecx
  1467.         jae @@doportanote_aold
  1468.           mov ecx,eax
  1469.           mov eax,[esp]
  1470.           add ax,[edi].chCurNormNote
  1471.           movsx eax,ax
  1472.           call getfreq6848
  1473.           mov ebx,eax
  1474.       @@doportanote_aold:
  1475.         pop eax
  1476.       inc ah
  1477.       cmp ah,48
  1478.       jne @@doportanote_aloop
  1479.       pop ecx
  1480.       mov eax,ebx
  1481. endif
  1482. endif
  1483.  
  1484. @@doportanote_setfinpitch:
  1485.   mov [edi].chFinalPitch,eax
  1486. @@doportanote_done:
  1487.   ret
  1488. doportanote endp
  1489. else
  1490.   doportanote=procnothing
  1491. endif
  1492.  
  1493.  
  1494. if USEVIBTYPE and (USEVIBRATO or USEVVIBRATO)
  1495. procvibtype proc
  1496.   mov al,[ebp].procdat
  1497.   and al,3
  1498.   mov [edi].chVibType,al
  1499.   ret
  1500. procvibtype endp
  1501. else
  1502.   procvibtype=procnothing
  1503. endif
  1504.  
  1505. if USEVIBRATO
  1506. procvibrato proc
  1507.   mov al,[ebp].procdat
  1508.   and al,0Fh
  1509.   jz @@procvibrato_reusel
  1510.     shl al,2
  1511.     mov [edi].chVibDep,al
  1512. @@procvibrato_reusel:
  1513.   mov al,[ebp].procdat
  1514.   and al,0F0h
  1515.   jz @@procvibrato_reuseh
  1516.     shr al,2
  1517.     mov [edi].chVibRate,al
  1518. @@procvibrato_reuseh:
  1519.   ret
  1520. procvibrato endp
  1521. else
  1522.   procvibrato=procnothing
  1523. endif
  1524.  
  1525. if USEVVIBRATE
  1526. procvvibrat proc
  1527.   mov al,[ebp].procvol
  1528.   shl al,2
  1529.   je @@procvvibrat_reuse
  1530.     mov [edi].chVibRate,al
  1531. @@procvvibrat_reuse:
  1532.   ret
  1533. procvvibrat endp
  1534. else
  1535.   procvvibrat=procnothing
  1536. endif
  1537.  
  1538. if USEVVIBRATO
  1539. procvvib proc
  1540.   mov al,[ebp].procvol
  1541.   shl al,2
  1542.   je @@procvvib_reuse
  1543.     mov [edi].chVibDep,al
  1544. @@procvvib_reuse:
  1545.   ret
  1546. procvvib endp
  1547. else
  1548.   procvvib=procnothing
  1549. endif
  1550.  
  1551. if USEVIBRATO or USEVVIBRATO
  1552. dovibrato proc
  1553.   movzx eax,word ptr [edi].chVibPos
  1554.   movsx eax,[ebp].vibtabs[eax]
  1555.   imul [edi].chVibDep
  1556.   sar eax,3
  1557.   add eax,[edi].chFinalPitch
  1558.   call freqrange
  1559.   mov [edi].chFinalPitch,eax
  1560.  
  1561.   cmp [ebp].tick0,0
  1562.   jne @@dovibrato_done
  1563.   mov al,[edi].chVibRate
  1564.   add [edi].chVibPos,al
  1565. @@dovibrato_done:
  1566.   ret
  1567. dovibrato endp
  1568. else
  1569.   dovibrato=procnothing
  1570. endif
  1571.  
  1572. if USEVOLSLIDE or USEVIBRATOVOL or USEPORTAVOL
  1573. procvolsl proc
  1574.   mov al,[ebp].procdat
  1575.   cmp al,0
  1576.   je @@procvolsl_reuse
  1577.     mov [edi].chVolSlideVal,al
  1578. @@procvolsl_reuse:
  1579.   ret
  1580. procvolsl endp
  1581.  
  1582. dovolsl proc
  1583.   mov bl,[edi].chVolSlideVal
  1584.   mov al,[edi].chVol
  1585.   cmp [ebp].tick0,0
  1586.   jne @@dovolsl_done
  1587.   test bl,0f0h
  1588.   jnz @@dovolsl_up
  1589.     sub al,bl
  1590.     jnc @@dovolsl_done
  1591.       mov al,0
  1592.     jmp @@dovolsl_done
  1593. @@dovolsl_up:
  1594.     shr bl,4
  1595.     add al,bl
  1596.     cmp al,40h
  1597.     jbe @@dovolsl_done
  1598.       mov al,40h
  1599. @@dovolsl_done:
  1600.   mov [edi].chVol,al
  1601.   mov [edi].chFinalVol,al
  1602.   ret
  1603. dovolsl endp
  1604. else
  1605.   procvolsl=procnothing
  1606.   dovolsl=procnothing
  1607. endif
  1608.  
  1609.  
  1610. if USEVIBRATOVOL and USEVIBRATO
  1611. dovibvol proc
  1612.   call dovibrato
  1613.   jmp dovolsl
  1614. dovibvol endp
  1615. else
  1616.   dovibvol=procnothing
  1617. endif
  1618.  
  1619. if USEPORTAVOL and USEPORTANOTE
  1620. doportavol proc
  1621.   call doportanote
  1622.   jmp dovolsl
  1623. doportavol endp
  1624. else
  1625.   doportavol=procnothing
  1626. endif
  1627.  
  1628. if USEGVOLSLIDE
  1629. procgvolsl proc
  1630.   mov al,[ebp].procdat
  1631.   cmp al,0
  1632.   je @@procgvolsl_reuse
  1633.     mov [edi].chGVolSlideVal,al
  1634. @@procgvolsl_reuse:
  1635.   ret
  1636. procgvolsl endp
  1637.  
  1638. dogvolsl proc
  1639.   mov bl,[edi].chGVolSlideVal
  1640.   mov al,[ebp].globalvol
  1641.   cmp [ebp].tick0,0
  1642.   jne @@dogvolsl_done
  1643.   test bl,0f0h
  1644.   jnz @@dogvolsl_up
  1645.     sub al,bl
  1646.     jnc @@dogvolsl_done
  1647.       mov al,0
  1648.     jmp @@dogvolsl_done
  1649. @@dogvolsl_up:
  1650.     shr bl,4
  1651.     add al,bl
  1652.     cmp al,40h
  1653.     jbe @@dogvolsl_done
  1654.       mov al,40h
  1655. @@dogvolsl_done:
  1656.   mov [ebp].globalvol,al
  1657.   ret
  1658. dogvolsl endp
  1659. else
  1660.   procgvolsl=procnothing
  1661.   dogvolsl=procnothing
  1662. endif
  1663.  
  1664. if USEPANSLIDE
  1665. procpansl proc
  1666.   mov al,[ebp].procdat
  1667.   cmp al,0
  1668.   je @@procpansl_reuse
  1669.     mov [edi].chPanSlideVal,al
  1670. @@procpansl_reuse:
  1671.   ret
  1672. procpansl endp
  1673.  
  1674. dopansl proc
  1675.   mov bl,[edi].chPanSlideVal
  1676.   mov al,[edi].chPan
  1677.   cmp [ebp].tick0,0
  1678.   jne @@dopansl_done
  1679.   test bl,0f0h
  1680.   jnz @@dopansl_left
  1681.     add al,bl
  1682.     jnc @@dopansl_done
  1683.       mov al,0ffh
  1684.     jmp @@dopansl_done
  1685. @@dopansl_left:
  1686.     shr bl,4
  1687.     sub al,bl
  1688.     jnc @@dopansl_done
  1689.       mov al,0
  1690. @@dopansl_done:
  1691.   mov [edi].chPan,al
  1692.   mov [edi].chFinalPan,al
  1693.   ret
  1694. dopansl endp
  1695. else
  1696.   procpansl=procnothing
  1697.   dopansl=procnothing
  1698. endif
  1699.  
  1700. if USEDELAY or USEKEYOFFCMD or USENOTECUT
  1701. proctick proc
  1702.   mov al,[ebp].procdat
  1703.   mov [edi].chActionTick,al
  1704.   ret
  1705. proctick endp
  1706. else
  1707.   proctick=procnothing
  1708. endif
  1709.  
  1710. if USEDELAY
  1711. dodelay proc
  1712.   cmp [ebp].tick0,0
  1713.   jne @@dodelay_done
  1714.   mov al,[ebp].curtick
  1715.   cmp al,[edi].chActionTick
  1716.   jne @@dodelay_done
  1717.     mov [ebp].notedelayed,1
  1718.     mov al,[edi].chDelayNote
  1719.     mov [ebp].procnot,al
  1720.     mov al,[edi].chCurIns
  1721.     mov [ebp].procins,al
  1722.     mov [ebp].proccmd,0ffh
  1723.     mov [ebp].procvol,0
  1724.     call PlayNote
  1725. @@dodelay_done:
  1726.   ret
  1727. dodelay endp
  1728. else
  1729.   dodelay=procnothing
  1730. endif
  1731.  
  1732. if USEKEYOFFCMD
  1733. dokeyoff proc
  1734.   cmp [ebp].tick0,0
  1735.   jne @@dokeyoff_done
  1736.   mov al,[ebp].curtick
  1737.   cmp al,[edi].chActionTick
  1738.   jne @@dokeyoff_done
  1739.     mov [edi].chSustain,0
  1740.  
  1741.     mov eax,[edi].chEnvIns
  1742.     cmp eax,0
  1743.     je @@dokeyoff_done
  1744.     cmp [eax].insVNum,0
  1745.     jne @@dokeyoff_done
  1746.       mov [edi].chFadeVol,0
  1747.  
  1748. @@dokeyoff_done:
  1749.   ret
  1750. dokeyoff endp
  1751. else
  1752.   dokeyoff=procnothing
  1753. endif
  1754.  
  1755. if USENOTECUT
  1756. donotecut proc
  1757.   cmp [ebp].tick0,0
  1758.   jne @@donotecut_done
  1759.   mov al,[ebp].curtick
  1760.   cmp al,[edi].chActionTick
  1761.   jne @@donotecut_done
  1762.     mov [edi].chVol,0
  1763.     mov [edi].chFinalVol,0
  1764. @@donotecut_done:
  1765.   ret
  1766. donotecut endp
  1767. else
  1768.   donotecut=procnothing
  1769. endif
  1770.  
  1771. if USERETRIG
  1772. doretrig proc
  1773.   cmp [edi].chActionTick,0
  1774.   je @@doretrig_done
  1775.     movzx eax,[ebp].curtick
  1776.     div [edi].chActionTick
  1777.     cmp ah,0
  1778.     jne @@doretrig_done
  1779.       mov [edi].chGUSNextPos,0
  1780. @@doretrig_done:
  1781.   ret
  1782. doretrig endp
  1783. else
  1784.   doretrig=procnothing
  1785. endif
  1786.  
  1787. if USEMRETRIG
  1788. procmretrig proc
  1789.   movzx eax,[ebp].procdat
  1790.   cmp al,0
  1791.   je @@procmretrig_reuse
  1792.     shl eax,4
  1793.     shr al,4
  1794.     mov [edi].chMRetrigLen,al
  1795.     mov [edi].chMRetrigAct,ah
  1796.     mov [edi].chMRetrigPos,0
  1797. @@procmretrig_reuse:
  1798.   ret
  1799. procmretrig endp
  1800.  
  1801. domretrig proc
  1802.   mov al,[edi].chMRetrigPos
  1803.   inc [edi].chMRetrigPos
  1804.   cmp al,[edi].chMRetrigLen
  1805.   jne @@domretrig_done
  1806.     mov [edi].chMRetrigPos,0
  1807.     mov [edi].chGUSNextPos,0
  1808.  
  1809.     mov al,[edi].chVol
  1810.     mov bl,[edi].chMRetrigAct
  1811.     mov ah,128
  1812.     xchg bl,cl
  1813.     rol ah,cl
  1814.     xchg bl,cl
  1815.     test bl,7
  1816.     jz @@domretrig_done
  1817.     test bl,8
  1818.     jnz @@domretrig_up
  1819.     cmp bl,5
  1820.     ja @@domretrig_nosub
  1821.       sub al,ah
  1822.   @@domretrig_nosub:
  1823.     cmp bl,6
  1824.     jne @@domretrig_not6
  1825.       mov ah,al
  1826.       shr al,2
  1827.       add al,ah
  1828.       shr al,1
  1829.   @@domretrig_not6:
  1830.     cmp bl,7
  1831.     jne @@domretrig_setvol
  1832.       shr al,1
  1833.     jmp @@domretrig_setvol
  1834.  
  1835.   @@domretrig_up:
  1836.     cmp bl,13
  1837.     ja @@domretrig_noadd
  1838.       add al,ah
  1839.   @@domretrig_noadd:
  1840.     cmp bl,14
  1841.     jne @@domretrig_not14
  1842.       mov ah,al
  1843.       shr al,1
  1844.       add al,ah
  1845.   @@domretrig_not14:
  1846.     cmp bl,15
  1847.     jne @@domretrig_setvol
  1848.       shl al,1
  1849.       jns @@domretrig_setvol
  1850.         dec al
  1851.  
  1852.   @@domretrig_setvol:
  1853.     cmp al,0
  1854.     jge @@domretrig_lok
  1855.       mov al,0
  1856.   @@domretrig_lok:
  1857.     cmp al,40h
  1858.     jbe @@domretrig_tok
  1859.       mov al,40h
  1860.   @@domretrig_tok:
  1861.  
  1862.     mov [edi].chVol,al
  1863.     mov [edi].chFinalVol,al
  1864. @@domretrig_done:
  1865.   ret
  1866. domretrig endp
  1867. else
  1868.   procmretrig=procnothing
  1869.   domretrig=procnothing
  1870. endif
  1871.  
  1872.  
  1873.  
  1874.  
  1875.  
  1876. ;//***************************************************************************
  1877. ;//effects end
  1878.  
  1879. callproccmdtab proc
  1880.   call @@callproccmdtab_getadr
  1881. @@callproccmdtab_getadr:
  1882.   pop ebx
  1883.   mov eax,[ebx+4*eax+(proccmdtab-@@callproccmdtab_getadr)]
  1884.   lea eax,[eax+ebx+(procnothing-@@callproccmdtab_getadr)]
  1885.   jmp eax
  1886. callproccmdtab endp
  1887.  
  1888.  
  1889.  
  1890. PlayTick proc
  1891.   mov [ebp].tick0,0
  1892.   lea edi,[ebp].chandata
  1893.   xor ecx,ecx
  1894. @@PlayTick_resetvalloop:
  1895.     mov al,[edi].chVol
  1896.     mov [edi].chFinalVol,al
  1897.     mov al,[edi].chPan
  1898.     mov [edi].chFinalPan,al
  1899.     mov eax,[edi].chPitch
  1900.     mov [edi].chFinalPitch,eax
  1901.   add edi,channelsize
  1902.   inc ecx
  1903.   cmp ecx,[ebp].head.hdNChannels
  1904.   jne @@PlayTick_resetvalloop
  1905.  
  1906.   inc [ebp].curtick
  1907.   mov al,[ebp].curtick
  1908.   cmp al,[ebp].curtempo
  1909.   jne @@PlayTick_notnextrow
  1910.  
  1911.     mov [ebp].curtick,0
  1912.     cmp [ebp].patdelay,0
  1913.     jz @@PlayTick_nextrow
  1914.       dec [ebp].patdelay
  1915.       jmp @@PlayTick_notnextrow
  1916.   @@PlayTick_nextrow:
  1917.     mov [ebp].tick0,1
  1918.  
  1919.     inc [ebp].currow
  1920.     cmp [ebp].jumptoord,-1
  1921.     jne @@PlayTick_dojump
  1922.     mov eax,[ebp].currow
  1923.     cmp eax,[ebp].patlen
  1924.     jb @@PlayTick_donotjump
  1925.       mov eax,[ebp].curord
  1926.       inc eax
  1927.       mov [ebp].jumptoord,eax
  1928.       mov [ebp].jumptorow,0
  1929.   @@PlayTick_dojump:
  1930.  
  1931.       mov eax,[ebp].jumptoord
  1932.       cmp [ebp].curord,eax
  1933.       je @@PlayTick_noresetploop
  1934.         lea edi,[ebp].chandata
  1935.         xor ecx,ecx
  1936.       @@PlayTick_resetplloop:
  1937.           mov [edi].chPatLoopCount,0
  1938.           mov [edi].chPatLoopStart,0
  1939.           add edi,channelsize
  1940.         inc ecx
  1941.         cmp ecx,[ebp].head.hdNChannels
  1942.         jne @@PlayTick_resetplloop
  1943.     @@PlayTick_noresetploop:
  1944.  
  1945.       mov eax,[ebp].jumptoord
  1946.       cmp eax,[ebp].head.hdNOrders
  1947.       jb @@PlayTick_dontloop
  1948.         mov eax,[ebp].head.hdOrdLoopStart
  1949.     @@PlayTick_dontloop:
  1950.       mov [ebp].curord,eax
  1951.       mov eax,[ebp].jumptorow
  1952.       mov [ebp].currow,eax
  1953.       mov [ebp].jumptoord,-1
  1954.       mov eax,[ebp].curord
  1955.       movzx eax,[ebp].head.hdOrderTable[eax]
  1956.       mov esi,[ebp].head.hdPatternTable[4*eax]
  1957.       lodsd
  1958.       mov [ebp].patlen,eax
  1959.       cmp [ebp].jumptorow,0
  1960.       je @@PlayTick_rowfound
  1961.     @@PlayTick_rowfind:
  1962.       @@PlayTick_chanskip:
  1963.           lodsb
  1964.           cmp al,0
  1965.           je @@PlayTick_rowend
  1966.  
  1967.           test al,20h
  1968.           jz @@PlayTick_not20
  1969.             add esi,2
  1970.         @@PlayTick_not20:
  1971.           test al,40h
  1972.           jz @@PlayTick_not40
  1973.             inc esi
  1974.         @@PlayTick_not40:
  1975.           test al,80h
  1976.           jz @@PlayTick_chanskip
  1977.             add esi,2
  1978.           jmp @@PlayTick_chanskip
  1979.       @@PlayTick_rowend:
  1980.  
  1981.       dec [ebp].jumptorow
  1982.       jnz @@PlayTick_rowfind
  1983.     @@PlayTick_rowfound:
  1984.       mov [ebp].patptr,esi
  1985.   @@PlayTick_donotjump:
  1986.  
  1987.     mov esi,[ebp].patptr
  1988.     lea edi,[ebp].chandata
  1989.     xor ecx,ecx
  1990.   @@PlayTick_processrow:
  1991.       mov [ebp].procnot,0
  1992.       mov dword ptr [ebp].procins,0
  1993.       mov [edi].chCommand,0ffh
  1994.  
  1995.       mov al,[esi]
  1996.       cmp al,0
  1997.       je @@PlayTick_procnextchan
  1998.  
  1999.       and al,1fh
  2000.       cmp al,cl
  2001.       jne @@PlayTick_procnextchan
  2002.  
  2003.       lodsb
  2004.       mov ah,al
  2005.       test ah,20h
  2006.       jz @@PlayTick_nonot
  2007.         lodsb
  2008.         mov [ebp].procnot,al
  2009.         lodsb
  2010.         mov [ebp].procins,al
  2011.     @@PlayTick_nonot:
  2012.       test ah,40h
  2013.       jz @@PlayTick_novol
  2014.         lodsb
  2015.         mov [ebp].procvol,al
  2016.     @@PlayTick_novol:
  2017.       test ah,80h
  2018.       jz @@PlayTick_nocmd
  2019.         lodsb
  2020.         mov [ebp].proccmd,al
  2021.         lodsb
  2022.         mov [ebp].procdat,al
  2023.     @@PlayTick_nocmd:
  2024.     @@PlayTick_procnote:
  2025.       mov [ebp].notedelayed,0
  2026.       call PlayNote
  2027.  
  2028. if USEVOLCOL
  2029.       movzx eax,[ebp].procvol
  2030.       and [ebp].procvol,0fh
  2031.       shr eax,4
  2032.       mov [edi].chVCommand,al
  2033.       add eax,(procvoltab-proccmdtab)/4
  2034.       call callproccmdtab
  2035. endif
  2036.  
  2037.       movzx eax,[ebp].proccmd
  2038.       cmp al,52
  2039.       jae @@PlayTick_procnextchan
  2040.         mov [edi].chCommand,al
  2041.         call callproccmdtab
  2042.  
  2043.     @@PlayTick_procnextchan:
  2044.       add edi,channelsize
  2045.     inc ecx
  2046.     cmp ecx,[ebp].head.hdNChannels
  2047.     jne @@PlayTick_processrow
  2048.     inc esi
  2049.     mov [ebp].patptr,esi
  2050.  
  2051. @@PlayTick_notnextrow:
  2052.  
  2053.   lea edi,[ebp].chandata
  2054.   xor ecx,ecx
  2055. @@PlayTick_dotickloop:
  2056. if USEVOLCOL
  2057. ;//process volume column
  2058.     movzx eax,[edi].chVCommand
  2059.     add eax,(dovoltab-proccmdtab)/4
  2060.     call callproccmdtab
  2061. endif
  2062.  
  2063. ;//process command
  2064.     movzx eax,[edi].chCommand
  2065.     cmp al,52
  2066.     jae @@PlayTick_donocmd
  2067.       add eax,(docmdtab-proccmdtab)/4
  2068.       call callproccmdtab
  2069.   @@PlayTick_donocmd:
  2070.  
  2071.     mov ebx,[edi].chEnvIns
  2072.     cmp ebx,0
  2073.     je @@PlayTick_noenvins
  2074.  
  2075. ;//process fadeout
  2076.     movzx eax,[edi].chFinalVol
  2077.     mul [ebp].uservol
  2078.     shr eax,6
  2079.     mul [ebp].globalvol
  2080.     mul [edi].chFadeVol
  2081.     shr edx,4
  2082.     mov [edi].chFinalVol,dl
  2083.  
  2084.     cmp [edi].chSustain,0
  2085.     jne @@PlayTick_sustain
  2086.       mov ax,[ebx].insVolFade
  2087.       sub [edi].chFadeVol,ax
  2088.       jnb @@PlayTick_sustain
  2089.         mov [edi].chFadeVol,0
  2090.   @@PlayTick_sustain:
  2091.  
  2092. if USEVOLENV
  2093. ;//process volume envelope
  2094.     mov eax,[edi].chVolEnvPos
  2095.     cmp [edi].chVolEnvSegPos,0
  2096.     je @@PlayTick_vnoloop
  2097.     cmp al,[ebx].insVLoopE
  2098.     jne @@PlayTick_vnoloop
  2099.       mov al,[ebx].insVLoopS
  2100.       mov [edi].chVolEnvPos,eax
  2101.   @@PlayTick_vnoloop:
  2102.     lea esi,[ebx].insVEnv[4*eax]
  2103.     cmp al,[ebx].insVNum
  2104.     je @@PlayTick_venvlast
  2105.       mov ax,[esi][4][2]
  2106.       mov dx,[esi][0][2]
  2107.       sub eax,edx
  2108.       imul [edi].chVolEnvSegPos
  2109.       idiv word ptr [esi][0][0]
  2110.       add al,byte ptr [esi][0][2]
  2111.       mul [edi].chFinalVol
  2112.       shr eax,6
  2113.       mov [edi].chFinalVol,al
  2114.  
  2115.       mov ax,[edi].chVolEnvSegPos
  2116.       cmp ax,0
  2117.       jne @@PlayTick_vnosustain
  2118.       cmp [edi].chSustain,0
  2119.       je @@PlayTick_vnosustain
  2120.         mov edx,[edi].chVolEnvPos
  2121.         cmp dl,[ebx].insVSustain
  2122.         je @@PlayTick_venvnostep
  2123.     @@PlayTick_vnosustain:
  2124.       inc eax
  2125.       cmp ax,[esi][0][0]
  2126.       jb @@PlayTick_venvnostep
  2127.         xor eax,eax
  2128.         inc [edi].chVolEnvPos
  2129.     @@PlayTick_venvnostep:
  2130.       mov [edi].chVolEnvSegPos,ax
  2131.       jmp @@PlayTick_venvend
  2132.  
  2133.   @@PlayTick_venvlast:
  2134.       mov al,byte ptr [esi][0][2]
  2135.       mul [edi].chFinalVol
  2136.       shr eax,6
  2137.       mov [edi].chFinalVol,al
  2138.   @@PlayTick_venvend:
  2139. endif
  2140.  
  2141. if USEPANENV
  2142. ;//process panning envelope
  2143.     mov eax,[edi].chPanEnvPos
  2144.     cmp [edi].chPanEnvSegPos,0
  2145.     je @@PlayTick_pnoloop
  2146.     cmp al,[ebx].insPLoopE
  2147.     jne @@PlayTick_pnoloop
  2148.       mov al,[ebx].insPLoopS
  2149.       mov [edi].chPanEnvPos,eax
  2150.   @@PlayTick_pnoloop:
  2151.     lea esi,[ebx].insPEnv[4*eax]
  2152.     cmp al,[ebx].insPNum
  2153.     je @@PlayTick_penvlast
  2154.       mov ax,[esi][4][2]
  2155.       mov dx,[esi][0][2]
  2156.       sub eax,edx
  2157.       imul [edi].chPanEnvSegPos
  2158.       idiv byte ptr [esi][0][0]
  2159.       add al,byte ptr [esi][0][2]
  2160.       sub al,32
  2161.       movsx edx,[edi].chFinalPan
  2162.       xor dl,dh
  2163.       imul dl
  2164.       shr eax,5
  2165.       add [edi].chFinalPan,al
  2166.  
  2167.       mov ax,[edi].chPanEnvSegPos
  2168.       cmp ax,0
  2169.       jne @@PlayTick_pnosustain
  2170.       cmp [edi].chSustain,0
  2171.       je @@PlayTick_pnosustain
  2172.         mov edx,[edi].chPanEnvPos
  2173.         cmp dl,[ebx].insPSustain
  2174.         je @@PlayTick_penvnostep
  2175.     @@PlayTick_pnosustain:
  2176.       inc eax
  2177.       cmp ax,[esi][0][0]
  2178.       jb @@PlayTick_penvnostep
  2179.         xor eax,eax
  2180.         inc [edi].chPanEnvPos
  2181.     @@PlayTick_penvnostep:
  2182.       mov [edi].chPanEnvSegPos,ax
  2183.       jmp @@PlayTick_penvend
  2184.  
  2185.   @@PlayTick_penvlast:
  2186.       mov al,byte ptr [esi][0][2]
  2187.       sub al,32
  2188.       movsx edx,[edi].chFinalPan
  2189.       xor dl,dh
  2190.       imul dl
  2191.       shr eax,5
  2192.       add [edi].chFinalPan,al
  2193.   @@PlayTick_penvend:
  2194. endif
  2195.  
  2196. if USEAUTOVIBRATO
  2197. ;//process auto vibrato
  2198.     movzx eax,[edi].chAVibPos
  2199.     mov ah,[ebx].insVibType
  2200.     mov al,[ebp].vibtabs[eax]
  2201.     imul [ebx].insVibDepth
  2202.     shr eax,4
  2203.  
  2204.     mov dl,[edi].chAVibSwpPos
  2205.     cmp dl,[ebx].insVibSweep
  2206.     jae @@PlayTick_nosweep
  2207.       imul dl
  2208.       idiv [ebx].insVibSweep
  2209.       inc [edi].chAVibSwpPos
  2210.   @@PlayTick_nosweep:
  2211.  
  2212.     neg eax
  2213.     movsx eax,al
  2214.     add eax,[edi].chFinalPitch
  2215.     call freqrange
  2216.     mov [edi].chFinalPitch,eax
  2217.  
  2218.     mov al,[ebx].insVibRate
  2219.     add [edi].chAVibPos,al
  2220. endif
  2221.  
  2222.   @@PlayTick_noenvins:
  2223.  
  2224. ;//conv vals for gus
  2225.     movzx eax,[edi].chFinalVol
  2226.     shl eax,1
  2227.     mov ax,[ebp].guslinvol[2*eax]
  2228.     mov [edi].chGUSVol,ax
  2229.  
  2230.     mov al,[edi].chFinalPan
  2231.     shr al,4
  2232.     mov [edi].chGUSPan,al
  2233.  
  2234.     mov eax,[edi].chFinalPitch
  2235. if USEBOTHFREQ
  2236.     test byte ptr [ebp].head.hdOptions,1
  2237.     jz @@PlayTick_amiga
  2238. endif
  2239. if USELINEARFREQ
  2240.       call getfreq6848
  2241.       mul [ebp].guschannels
  2242.       mov ebx,494
  2243.       div ebx
  2244. endif
  2245. if USEBOTHFREQ
  2246.       jmp @@PlayTick_noamiga
  2247. endif
  2248. if USEAMIGAFREQ
  2249.   @@PlayTick_amiga:
  2250.       cmp eax,100
  2251.       jb @@PlayTick_noamiga
  2252.       mov ebx,eax
  2253.       mov eax,94929
  2254.       mul [ebp].guschannels
  2255.       div ebx
  2256.   @@PlayTick_noamiga:
  2257. endif
  2258.  
  2259.     and al,not 1
  2260.     mov [edi].chGUSFrq,ax
  2261.  
  2262.   add edi,channelsize
  2263.   inc ecx
  2264.   cmp ecx,[ebp].head.hdNChannels
  2265.   jne @@PlayTick_dotickloop
  2266.  
  2267.   ret
  2268. PlayTick endp
  2269.  
  2270.  
  2271.  
  2272.  
  2273.  
  2274. public xmpPlay_
  2275. xmpPlay_ proc
  2276.   push ebp
  2277.   call loadebp
  2278.  
  2279.   mov [ebp].jumptoord,eax
  2280.   mov [ebp].curord,eax
  2281.   xor eax,eax
  2282.   mov [ebp].currow,eax
  2283.  
  2284.   call gusOpen
  2285.  
  2286.   lea edi,[ebp].chandata
  2287.   mov ecx,channelsize*8
  2288.   xor eax,eax
  2289.   rep stosd
  2290.  
  2291.   lea edi,[ebp].chandata
  2292.   xor ecx,ecx
  2293. @@xmpPlay_panloop:
  2294.     mov al,[ebp].head.hdPanPos[ecx]
  2295.     mov [edi].chPan,al
  2296.     add edi,channelsize
  2297.   inc ecx
  2298.   cmp cl,32
  2299.   jne @@xmpPlay_panloop
  2300.  
  2301.   xor eax,eax
  2302.   mov [ebp].globalvol,40h
  2303.   mov [ebp].jumptorow,eax
  2304.   mov [ebp].syncval,al
  2305.  
  2306.   mov al,[ebp].head.hdIniTempo
  2307.   mov [ebp].curtempo,al
  2308.   dec al
  2309.   mov [ebp].curtick,al
  2310.  
  2311.   mov eax,2983615
  2312.   xor edx,edx
  2313.   movzx ebx,[ebp].head.hdIniBPM
  2314.   div ebx
  2315.   mov [ebp].stimerlen,eax
  2316.   call tmInit
  2317.   pop ebp
  2318.   ret
  2319. xmpPlay_ endp
  2320.  
  2321. public xmpStop_
  2322. xmpStop_ proc
  2323.   push ebp
  2324.   call loadebp
  2325.   call tmClose
  2326.   call gusClose
  2327.   pop ebp
  2328.   ret
  2329.   ja $+1Bh
  2330.   or [edi],edx
  2331. xmpStop_ endp
  2332.  
  2333.  
  2334. ;//*************************************************************************
  2335. ;// system timer
  2336.  
  2337.  
  2338.  
  2339. tmTimerHandler proc
  2340.   pushad
  2341.   push ds
  2342.   push es
  2343.   push fs
  2344.   push gs
  2345.  
  2346.   call loadebp
  2347.   mov esi,ebp
  2348.  
  2349.   cld
  2350.   mov ds,cs:[esi].datasegsel
  2351.   mov es,[esi].datasegsel
  2352.  
  2353.   mov eax,[esi].tmTimerRate
  2354.   add [esi].tmTicker,eax
  2355.  
  2356.   add [esi].tmIntCount,eax
  2357.   cmp byte ptr [esi].tmIntCount+2,0
  2358.   je @@tmTimerHandler_noorgcall
  2359.     mov byte ptr [esi].tmIntCount+2,0
  2360.     pushfd
  2361.     call [esi].tmOldTimer
  2362. @@tmTimerHandler_noorgcall:
  2363.  
  2364.   mov al,20h
  2365.   out 20h,al
  2366.  
  2367.   mov ebx,[esi].maxtimerrate
  2368.   mov ecx,[esi].stimerlen
  2369.   mov edx,[esi].stimerpos
  2370.  
  2371.   sub edx,ebx
  2372.   ja @@tmTimerHandler_another
  2373.     mov edx,ecx
  2374. @@tmTimerHandler_another:
  2375.  
  2376.   mov [esi].stimerpos,edx
  2377.  
  2378.   cmp edx,ebx
  2379.   jb @@tmTimerHandler_intervalok
  2380.     mov edx,ebx
  2381. @@tmTimerHandler_intervalok:
  2382.   mov [esi].tmTimerRate,edx
  2383.   mov al,34h
  2384.   out 43h,al
  2385.   mov al,dl
  2386.   out 40h,al
  2387.   mov al,dh
  2388.   out 40h,al
  2389.  
  2390.   cmp [esi].stimerpos,ecx
  2391.   jne @@tmTimerHandler_notick
  2392.   cmp [esi].tmInRoutine,0
  2393.   jnz @@tmTimerHandler_notick
  2394.     mov [esi].tmInRoutine,1
  2395.     mov dword ptr [esi].tmOldSSESP,esp
  2396.     mov word ptr [esi].tmOldSSESP+4,ss
  2397.     push ds
  2398.     pop ss
  2399.     lea esp,[esi].tmStack+1024
  2400.     sti
  2401.     call gusPlayTick
  2402.     call PlayTick
  2403.     cli
  2404.     lss esp,[ebp].tmOldSSESP
  2405.     mov ds:[ebp].tmInRoutine,0
  2406. @@tmTimerHandler_notick:
  2407.  
  2408.   pop gs
  2409.   pop fs
  2410.   pop es
  2411.   pop ds
  2412.   popad
  2413.   iretd
  2414. tmTimerHandler endp
  2415.  
  2416.  
  2417.  
  2418.  
  2419. tmInit proc
  2420.   mov [ebp].datasegsel,ds
  2421.  
  2422.   xor eax,eax
  2423.   mov [ebp].stimerpos,eax
  2424.   mov [ebp].tmIntCount,eax
  2425.   mov [ebp].tmInRoutine,0
  2426.   mov [ebp].tmTimerRate,65536
  2427.   mov eax,-65536
  2428.   sub eax,[ebp].stimerlen
  2429.   mov [ebp].tmTicker,eax
  2430.  
  2431. if GETSETINTMODEMULTI
  2432. if GETSETINTMODE and 1
  2433.   cmp [ebp].tmGetSetIntMode,MXMINTMODEDPMI
  2434.   je @@tmInit_dpmi
  2435. endif
  2436. if GETSETINTMODE and 2
  2437.   cmp [ebp].tmGetSetIntMode,MXMINTMODEDOS
  2438.   je @@tmInit_dos
  2439. endif
  2440.   jmp @@tmInit_setdone
  2441. endif
  2442.  
  2443. if GETSETINTMODE and 1
  2444. @@tmInit_dpmi:
  2445.     mov ax,0204h
  2446.     mov bl,8
  2447.     int 31h
  2448.     mov dword ptr [ebp].tmOldTimer+0,edx
  2449.     mov word ptr [ebp].tmOldTimer+4,cx
  2450.     mov ax,0205h
  2451.     mov bl,8
  2452.     call @@tmInit_getadrdpmi
  2453.   @@tmInit_getadrdpmi:
  2454.     pop edx
  2455.     add edx,tmTimerHandler-@@tmInit_getadrdpmi
  2456.     mov cx,cs
  2457.     int 31h
  2458. endif
  2459. if GETSETINTMODEMULTI
  2460.   jmp @@tmInit_setdone
  2461. endif
  2462.  
  2463. if GETSETINTMODE and 2
  2464. @@tmInit_dos:
  2465.     push es
  2466.     mov ax,3508h
  2467.     int 21h
  2468.     mov dword ptr [ebp].tmOldTimer+0,ebx
  2469.     mov word ptr [ebp].tmOldTimer+4,es
  2470.     pop es
  2471.     push ds
  2472.     mov ax,2508h
  2473.     push cs
  2474.     pop ds
  2475.     call @@tmInit_getadrdos
  2476.   @@tmInit_getadrdos:
  2477.     pop edx
  2478.     add edx,tmTimerHandler-@@tmInit_getadrdos
  2479.     int 21h
  2480.     pop ds
  2481. endif
  2482. if GETSETINTMODEMULTI
  2483.   jmp @@tmInit_setdone
  2484. endif
  2485.  
  2486. @@tmInit_setdone:
  2487.  
  2488.   mov al,34h
  2489.   out 43h,al
  2490.   mov eax,[ebp].tmTimerRate
  2491.   out 40h,al
  2492.   mov al,ah
  2493.   out 40h,al
  2494.   ret
  2495. tmInit endp
  2496.  
  2497.  
  2498. tmClose proc
  2499. if GETSETINTMODEMULTI
  2500. if GETSETINTMODE and 1
  2501.   cmp [ebp].tmGetSetIntMode,MXMINTMODEDPMI
  2502.   je @@tmClose_dpmi
  2503. endif
  2504. if GETSETINTMODE and 2
  2505.   cmp [ebp].tmGetSetIntMode,MXMINTMODEDOS
  2506.   je @@tmClose_dos
  2507. endif
  2508.   jmp @@tmClose_resetdone
  2509. endif
  2510.  
  2511. if GETSETINTMODE and 1
  2512. @@tmClose_dpmi:
  2513.     mov ax,0205h
  2514.     mov bl,8
  2515.     mov edx,dword ptr [ebp].tmOldTimer
  2516.     mov cx,word ptr [ebp].tmOldTimer+4
  2517.     int 31h
  2518. if GETSETINTMODEMULTI
  2519.   jmp @@tmClose_resetdone
  2520. endif
  2521. endif
  2522.  
  2523. if GETSETINTMODE and 2
  2524. @@tmClose_dos:
  2525.     push ds
  2526.     mov ax,2508h
  2527.     lds edx,[ebp].tmOldTimer
  2528.     int 21h
  2529.     pop ds
  2530. if GETSETINTMODEMULTI
  2531.   jmp @@tmClose_resetdone
  2532. endif
  2533. endif
  2534.  
  2535. @@tmClose_resetdone:
  2536.  
  2537.   mov al,34h
  2538.   out 43h,al
  2539.   xor al,al
  2540.   out 40h,al
  2541.   out 40h,al
  2542.   ret
  2543. tmClose endp
  2544.  
  2545. public xmpGetTimer_
  2546. xmpGetTimer_ proc
  2547.   pushf
  2548.   xor eax,eax
  2549.   cli
  2550.   out 43h,al
  2551.   in al,40h
  2552.   mov ah,al
  2553.   in al,40h
  2554.   popf
  2555.   xchg ah,al
  2556.   neg eax
  2557.   push ebp
  2558.   call loadebp
  2559.   add eax,[ebp].tmTimerRate
  2560.   add eax,[ebp].tmTicker
  2561.   pop ebp
  2562.   ret
  2563. xmpGetTimer_ endp
  2564.  
  2565.  
  2566.  
  2567.  
  2568.  
  2569. ;//*************************************************************************
  2570. ;// GUS
  2571.  
  2572. gusoutp proc
  2573.   add edx,[ebp].gusport
  2574.   out dx,al
  2575.   sub edx,[ebp].gusport
  2576.   ret
  2577. gusoutp endp
  2578.  
  2579. gusout proc
  2580.   push edx
  2581.   mov dx,103h
  2582.   xchg al,bl
  2583.   call gusoutp
  2584.   add dl,2
  2585.   xchg al,bl
  2586.   call gusoutp
  2587.   pop edx
  2588.   ret
  2589. gusout endp
  2590.  
  2591. gusoutd proc
  2592.   push edx
  2593.   mov dx,103h
  2594.   xchg al,bl
  2595.   call gusoutp
  2596.   add dl,2
  2597.   xchg al,bl
  2598.   call gusoutp
  2599.   call gusdelay
  2600.   call gusoutp
  2601.   pop edx
  2602.   ret
  2603. gusoutd endp
  2604.  
  2605. gusoutw proc
  2606.   push edx
  2607.   mov dx,103h
  2608.   xchg al,bl
  2609.   call gusoutp
  2610.   inc edx
  2611.   xchg al,bl
  2612.   add edx,[ebp].gusport
  2613.   out dx,ax
  2614.   pop edx
  2615.   ret
  2616. gusoutw endp
  2617.  
  2618. gusin proc
  2619.   push edx
  2620.   mov dx,103h
  2621.   xchg al,bl
  2622.   call gusoutp
  2623.   add dl,2
  2624.   xchg al,bl
  2625.   add edx,[ebp].gusport
  2626.   in al,dx
  2627.   pop edx
  2628.   ret
  2629. gusin endp
  2630.  
  2631. gusinw proc
  2632.   push edx
  2633.   mov dx,103h
  2634.   xchg al,bl
  2635.   call gusoutp
  2636.   inc edx
  2637.   xchg al,bl
  2638.   add edx,[ebp].gusport
  2639.   in ax,dx
  2640.   pop edx
  2641.   ret
  2642. gusinw endp
  2643.  
  2644. gusdelay proc
  2645.   push edx
  2646.   push eax
  2647.   mov dx,107h
  2648.   add edx,[ebp].gusport
  2649.   in al,dx
  2650.   in al,dx
  2651.   in al,dx
  2652.   in al,dx
  2653.   in al,dx
  2654.   in al,dx
  2655.   in al,dx
  2656.   pop eax
  2657.   pop edx
  2658.   ret
  2659. gusdelay endp
  2660.  
  2661. gusselchn proc
  2662.   push edx
  2663.   mov dx,102h
  2664.   xchg al,cl
  2665.   call gusoutp
  2666.   xchg al,cl
  2667.   pop edx
  2668.   ret
  2669. gusselchn endp
  2670.  
  2671.  
  2672. gussetpoint proc
  2673.   push eax
  2674.   shr eax,7
  2675.   and eax,1FFFh
  2676.   call gusoutw
  2677.   mov eax,[esp]
  2678.   inc bl
  2679.   shl eax,9
  2680.   call gusoutw
  2681.   dec bl
  2682.   pop eax
  2683.   ret
  2684. gussetpoint endp
  2685.  
  2686. gusopenchan proc
  2687.   cmp al,14
  2688.   jae @@gusopenchan_chanok
  2689.     mov al,14
  2690. @@gusopenchan_chanok:
  2691.   mov [ebp].guschannels,eax
  2692.  
  2693.   mov bl,04ch
  2694.   mov al,0
  2695.   call gusout
  2696.   call gusdelay
  2697.   call gusdelay
  2698.   inc al
  2699.   call gusout
  2700.   call gusdelay
  2701.   call gusdelay
  2702.  
  2703.   mov bl,0eh
  2704.   mov al,byte ptr [ebp].guschannels
  2705.   dec al
  2706.   or al,0c0h
  2707.   call gusout
  2708.  
  2709.   xor ecx,ecx
  2710. @@gusopenchan_initloop:
  2711.     call gusselchn
  2712.     xor ax,ax
  2713.     mov bl,9
  2714.     call gusoutw
  2715.     mov al,3
  2716.     mov bl,0
  2717.     call gusoutd
  2718.     mov al,3
  2719.     mov bl,0dh
  2720.     call gusoutd
  2721.     mov al,3fh
  2722.     mov bl,6
  2723.     call gusout
  2724.     call gusdelay
  2725.   inc ecx
  2726.   cmp ecx,32
  2727.   jne @@gusopenchan_initloop
  2728.  
  2729.   mov bl,4ch
  2730.   mov al,7
  2731.   call gusout
  2732.  
  2733.   mov cl,0
  2734.   call gusselchn
  2735.   xor edx,edx
  2736.   mov al,8
  2737.   call gusoutp
  2738.   ret
  2739. gusopenchan endp
  2740.  
  2741.  
  2742.  
  2743.  
  2744.  
  2745.  
  2746. gusfadevol proc
  2747.   mov bl,89h
  2748.   call gusinw
  2749.   movzx eax,ax
  2750.   mov bl,0
  2751.   cmp eax,edx
  2752.   jbe @@gusfadevol_up
  2753.     xchg eax,edx
  2754.     mov bl,40h
  2755. @@gusfadevol_up:
  2756.  
  2757.   sub edx,eax
  2758.   jz @@gusfadevol_done
  2759.   cmp edx,4096
  2760.   jae @@gusfadevol_normfade
  2761.     cmp bl,40h
  2762.     je @@gusfadevol_swapped
  2763.       add eax,edx
  2764.   @@gusfadevol_swapped:
  2765.     mov bl,9
  2766.     call gusoutw
  2767.     jmp @@gusfadevol_done
  2768.  
  2769. @@gusfadevol_normfade:
  2770.   add edx,eax
  2771.  
  2772.   cmp eax,4096
  2773.   jae @@gusfadevol_stok
  2774.     mov eax,4096
  2775. @@gusfadevol_stok:
  2776.   cmp edx,64512
  2777.   jbe @@gusfadevol_eok
  2778.     mov edx,64512
  2779. @@gusfadevol_eok:
  2780.  
  2781.   push ebx
  2782.   mov al,ah
  2783.   mov bl,7
  2784.   call gusout
  2785.   mov al,dh
  2786.   mov bl,8
  2787.   call gusout
  2788.   pop eax
  2789.   mov bl,0dh
  2790.   call gusoutd
  2791.  
  2792. @@gusfadevol_done:
  2793.   ret
  2794. gusfadevol endp
  2795.  
  2796. gusfadevoldown proc
  2797.   push ebx
  2798.   push eax
  2799.   mov bl,07h
  2800.   mov al,04h
  2801.   call gusout
  2802.   mov bl,08h
  2803.   mov al,0fch
  2804.   call gusout
  2805.   mov bl,0dh
  2806.   mov al,40h
  2807.   call gusoutd
  2808.   pop eax
  2809.   pop ebx
  2810.   ret
  2811. gusfadevoldown endp
  2812.  
  2813.  
  2814. gusPlayTick proc
  2815.   cmp [ebp].gusport,0
  2816.   je @@gusPlayTick_nogus
  2817.  
  2818.   lea edi,[ebp].chandata
  2819.   xor ecx,ecx
  2820. @@gusPlayTick_clearloop:
  2821.     cmp [edi].chGUSInited,0
  2822.     je @@gusPlayTick_nostop
  2823.     cmp [edi].chGUSStopIt,0
  2824.     je @@gusPlayTick_nostop
  2825.       call gusselchn
  2826.       mov bl,0
  2827.       mov al,[edi].chGUSMode
  2828.       or al,3
  2829.       call gusoutd
  2830.       call gusfadevoldown
  2831.       mov [edi].chGUSStopIt,0
  2832.   @@gusPlayTick_nostop:
  2833.   add edi,channelsize
  2834.   inc ecx
  2835.   cmp ecx,[ebp].head.hdNChannels
  2836.   jne @@gusPlayTick_clearloop
  2837.  
  2838.   xor ecx,ecx
  2839. @@gusPlayTick_waitloop:
  2840.     call gusselchn
  2841.     mov bl,8dh
  2842.   @@gusPlayTick_dowait:
  2843.       call gusin
  2844.       test al,1
  2845.     jz @@gusPlayTick_dowait
  2846.   inc ecx
  2847.   cmp ecx,[ebp].head.hdNChannels
  2848.   jne @@gusPlayTick_waitloop
  2849.  
  2850.   lea edi,[ebp].chandata
  2851.   xor ecx,ecx
  2852. @@gusPlayTick_playloop:
  2853.     call gusselchn
  2854.     cmp [edi].chGUSInited,0
  2855.     je @@gusPlayTick_quiet
  2856.       cmp [edi].chGUSChangeSamp,0
  2857.       je @@gusPlayTick_samesample
  2858.         mov bl,2
  2859.         mov eax,[edi].chGUSLoopPos
  2860.         call gussetpoint
  2861.         mov bl,4
  2862.         mov eax,[edi].chGUSEndPos
  2863.         call gussetpoint
  2864.     @@gusPlayTick_samesample:
  2865.  
  2866.       cmp [edi].chGUSNextPos,-1
  2867.       je @@gusPlayTick_noposchange
  2868.         mov eax,[edi].chGUSNextPos
  2869.         add eax,[edi].chGUSStartPos
  2870.  
  2871.         cmp eax,[edi].chGUSEndPos
  2872.         jb @@gusPlayTick_posok
  2873.           mov eax,[edi].chGUSEndPos
  2874.           dec eax
  2875.       @@gusPlayTick_posok:
  2876.         mov bl,10
  2877.         call gussetpoint
  2878.         mov bl,80h
  2879.         call gusin
  2880.         mov bl,0
  2881.         and al,40h
  2882.         or al,[edi].chGUSMode
  2883.         call gusout
  2884.  
  2885.     @@gusPlayTick_noposchange:
  2886.       mov bl,80h
  2887.       call gusin
  2888.       test bl,1
  2889.       jnz @@gusPlayTick_quiet
  2890.         mov bl,0ch
  2891.         mov al,[edi].chGUSPan
  2892.         call gusout
  2893.         mov bl,1
  2894.         mov ax,[edi].chGUSFrq
  2895.         call gusoutw
  2896.         movzx edx,[edi].chGUSVol
  2897.         call gusfadevol
  2898.       jmp @@gusPlayTick_nextchan
  2899.  
  2900.   @@gusPlayTick_quiet:
  2901.       call gusfadevoldown
  2902.  
  2903.   @@gusPlayTick_nextchan:
  2904.     mov [edi].chGUSChangeSamp,0
  2905.     mov [edi].chGUSNextPos,-1
  2906.   add edi,channelsize
  2907.   inc ecx
  2908.   cmp ecx,[ebp].head.hdNChannels
  2909.   jne @@gusPlayTick_playloop
  2910.  
  2911. @@gusPlayTick_nogus:
  2912.   ret
  2913. gusPlayTick endp
  2914.  
  2915.  
  2916. gusOpen proc
  2917.   cmp [ebp].gusport,0
  2918.   je @@gusOpen_nogus
  2919.   mov eax,[ebp].head.hdNChannels
  2920.   call gusopenchan
  2921.   mov cl,0
  2922.   call gusselchn
  2923.   xor edx,edx
  2924.   mov al,9
  2925.   call gusoutp
  2926. @@gusOpen_nogus:
  2927.   ret
  2928. gusOpen endp
  2929.  
  2930. gusClose proc
  2931.   cmp [ebp].gusport,0
  2932.   je @@gusClose_nogus
  2933.   mov eax,14
  2934.   call gusopenchan
  2935. @@gusClose_nogus:
  2936.   ret
  2937. gusClose endp
  2938.  
  2939.  
  2940. gusUploadSamples proc
  2941.   cmp [ebp].gusport,0
  2942.   je @@gusUploadSamples_done
  2943.   mov edx,[ebp].gusport
  2944.   add edx,103h
  2945.   in al,dx
  2946.   cmp al,45h
  2947.   jne @@gusUploadSamples_doit
  2948.   dec edx
  2949.   in al,dx
  2950.   cmp al,30
  2951.   jne @@gusUploadSamples_doit
  2952.   add edx,5
  2953.   in al,dx
  2954.   cmp al,42
  2955.   je @@gusUploadSamples_done
  2956. @@gusUploadSamples_doit:
  2957.   shr ecx,4
  2958.   jz @@gusUploadSamples_done
  2959.   xor ebx,ebx
  2960.  
  2961. @@gusUploadSamples_bigloop:
  2962.     pushf
  2963.     cli
  2964.     mov edx,[ebp].gusport
  2965.     add dx,103h
  2966.     mov al,44h
  2967.     out dx,al
  2968.     add dl,2
  2969.     mov eax,ebx
  2970.     shr eax,16
  2971.     out dx,al
  2972.     sub dl,2
  2973.     mov al,43h
  2974.     out dx,al
  2975.     inc dl
  2976.   @@gusUploadSamples_loop:
  2977.       mov eax,ebx
  2978.       out dx,ax
  2979.       lodsb
  2980.       add dl,3
  2981.       out dx,al
  2982.       sub dl,3
  2983.       inc ebx
  2984.     test bl,0fh
  2985.     jnz @@gusUploadSamples_loop
  2986.     popf
  2987.   dec ecx
  2988.   jnz @@gusUploadSamples_bigloop
  2989. @@gusUploadSamples_done:
  2990.   ret
  2991. gusUploadSamples endp
  2992.  
  2993. public xmpGetGUSPort_
  2994. xmpGetGUSPort_ proc
  2995.   xor eax,eax
  2996.   cmp edi,0
  2997.   je @@xmpGetGUSPort_done
  2998.   xor ecx,ecx
  2999.   dec ecx
  3000.   jmp @@xmpGetGUSPort_scanentry
  3001. @@xmpGetGUSPort_envscan:
  3002.     repne scasb
  3003.   @@xmpGetGUSPort_scanentry:
  3004.     cmp byte ptr ds:[edi],0
  3005.     je @@xmpGetGUSPort_done
  3006.     cmp dword ptr ds:[edi],52544C55h
  3007.     jne @@xmpGetGUSPort_envscan
  3008.     cmp dword ptr ds:[edi+4],444E5341h
  3009.     jne @@xmpGetGUSPort_envscan
  3010.     cmp byte ptr ds:[edi+13],40h
  3011.     je @@xmpGetGUSPort_envscan
  3012.     cmp word ptr ds:[edi+8],323Dh
  3013.     jne @@xmpGetGUSPort_envscan
  3014.     cmp word ptr ds:[edi+11],2C30h
  3015.     jne @@xmpGetGUSPort_envscan
  3016.     mov al,byte ptr ds:[edi+10]
  3017.     shl al,4
  3018.     mov ah,2
  3019. @@xmpGetGUSPort_done:
  3020.   ret
  3021. xmpGetGUSPort_ endp
  3022.  
  3023.  
  3024. if DPMIPSPCODE
  3025. public xmpGetEnvPtrDPMI_
  3026. xmpGetEnvPtrDPMI_ proc
  3027.   push ds
  3028.   mov ds,ax
  3029.   mov bx,ds:[2Ch]
  3030.   pop ds
  3031.   mov ax,6
  3032.   xor edx,edx
  3033.   int 31h
  3034.   jc @@xmpGetEnvPtrDPMI_done
  3035.   shl edx,16
  3036.   shrd edx,ecx,16
  3037. @@xmpGetEnvPtrDPMI_done:
  3038.   mov edi,edx
  3039.   ret
  3040. xmpGetEnvPtrDPMI_ endp
  3041. endif
  3042.  
  3043. if DOS32CODE
  3044. public xmpGetEnvPtrDOS32_
  3045. xmpGetEnvPtrDOS32_ proc
  3046.   mov ax,0EE02h
  3047.   int 31h
  3048.   ret
  3049. xmpGetEnvPtrDOS32_ endp
  3050. endif
  3051.  
  3052.  
  3053. sintab db 0,2,3,5,6,8,9,11,12,14,16,17,19,20,22,23,24,26,27,29,30,32,33
  3054.        db 34,36,37,38,39,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56
  3055.        db 56,57,58,59,59,60,60,61,61,62,62,62,63,63,63,64,64,64,64,64
  3056. logfreqtab dw 32768,32761,32753,32746,32738,32731,32724,32716,32709,32702,32694,32687,32679,32672,32665,32657
  3057.            dw 32768,32650,32532,32415,32298,32182,32066,31950,31835,31720,31606,31492,31379,31266,31153,31041
  3058.            dw 32768,30929,29193,27554,26008,24548,23170,21870,20643,19484,18390,17358,16384,15464,14596,13777
  3059.            dd 11131415,4417505,1753088,695713,276094,109568,43482,17256,6848,2718,1078,428,170,67,27,11
  3060.  
  3061. proccmdtab label dword
  3062.   dd procarpeggio-procnothing
  3063.   dd procportau-procnothing
  3064.   dd procportad-procnothing
  3065.   dd procportanote-procnothing
  3066.   dd procvibrato-procnothing
  3067.   dd procvolsl-procnothing
  3068.   dd procvolsl-procnothing
  3069.   dd proctremolo-procnothing
  3070.   dd procpan-procnothing
  3071.   dd 0
  3072.   dd procvolsl-procnothing
  3073.   dd procjump-procnothing
  3074.   dd procnvol-procnothing
  3075.   dd procbreak-procnothing
  3076.   dd 0
  3077.   dd proctempo-procnothing
  3078.   dd procgvol-procnothing
  3079.   dd procgvolsl-procnothing
  3080.   dd 0
  3081.   dd 0
  3082.   dd proctick-procnothing
  3083.   dd procenvpos-procnothing
  3084.   dd 0
  3085.   dd 0
  3086.   dd 0
  3087.   dd procpansl-procnothing
  3088.   dd 0
  3089.   dd procmretrig-procnothing
  3090.   dd procsync-procnothing
  3091.   dd proctremor-procnothing
  3092.   dd 0
  3093.   dd 0
  3094.   dd procsync-procnothing
  3095.   dd procxfporta-procnothing
  3096.   dd 0
  3097.   dd 0
  3098.  
  3099.   dd 0
  3100.   dd procfportau-procnothing
  3101.   dd procfportad-procnothing
  3102.   dd procgliss-procnothing
  3103.   dd procvibtype-procnothing
  3104.   dd 0
  3105.   dd procpatloop-procnothing
  3106.   dd proctremtype-procnothing
  3107.   dd procspan-procnothing
  3108.   dd proctick-procnothing
  3109.   dd procfvolup-procnothing
  3110.   dd procfvoldn-procnothing
  3111.   dd proctick-procnothing
  3112.   dd proctick-procnothing
  3113.   dd procpatdelay-procnothing
  3114.   dd procsync-procnothing
  3115.  
  3116. docmdtab label dword
  3117.   dd doarpeggio-procnothing
  3118.   dd doportau-procnothing
  3119.   dd doportad-procnothing
  3120.   dd doportanote-procnothing
  3121.   dd dovibrato-procnothing
  3122.   dd doportavol-procnothing
  3123.   dd dovibvol-procnothing
  3124.   dd dotremolo-procnothing
  3125.   dd 0
  3126.   dd 0
  3127.   dd dovolsl-procnothing
  3128.   dd 0
  3129.   dd 0
  3130.   dd 0
  3131.   dd 0
  3132.   dd 0
  3133.   dd 0
  3134.   dd dogvolsl-procnothing
  3135.   dd 0
  3136.   dd 0
  3137.   dd dokeyoff-procnothing
  3138.   dd 0
  3139.   dd 0
  3140.   dd 0
  3141.   dd 0
  3142.   dd dopansl-procnothing
  3143.   dd 0
  3144.   dd domretrig-procnothing
  3145.   dd 0
  3146.   dd dotremor-procnothing
  3147.   dd 0
  3148.   dd 0
  3149.   dd 0
  3150.   dd 0
  3151.   dd 0
  3152.   dd 0
  3153.  
  3154.   dd 0
  3155.   dd 0
  3156.   dd 0
  3157.   dd 0
  3158.   dd 0
  3159.   dd 0
  3160.   dd 0
  3161.   dd 0
  3162.   dd 0
  3163.   dd doretrig-procnothing
  3164.   dd 0
  3165.   dd 0
  3166.   dd donotecut-procnothing
  3167.   dd dodelay-procnothing
  3168.   dd 0
  3169.   dd 0
  3170.  
  3171. if USEVOLCOL
  3172. procvoltab label dword
  3173.   dd 0
  3174.   dd procvvol0-procnothing
  3175.   dd procvvol1-procnothing
  3176.   dd procvvol2-procnothing
  3177.   dd procvvol3-procnothing
  3178.   dd procvvol4-procnothing
  3179.   dd procvvpsl-procnothing
  3180.   dd procvvpsl-procnothing
  3181.   dd procvfvoldn-procnothing
  3182.   dd procvfvolup-procnothing
  3183.   dd procvvibrat-procnothing
  3184.   dd procvvib-procnothing
  3185.   dd procvpan-procnothing
  3186.   dd procvvpsl-procnothing
  3187.   dd procvvpsl-procnothing
  3188.   dd procvportanote-procnothing
  3189.  
  3190. dovoltab label dword
  3191.   dd 0
  3192.   dd 0
  3193.   dd 0
  3194.   dd 0
  3195.   dd 0
  3196.   dd 0
  3197.   dd dovvolsld-procnothing
  3198.   dd dovvolslu-procnothing
  3199.   dd 0
  3200.   dd 0
  3201.   dd 0
  3202.   dd dovibrato-procnothing
  3203.   dd 0
  3204.   dd dovpansll-procnothing
  3205.   dd dovpanslr-procnothing
  3206.   dd doportanote-procnothing
  3207. endif
  3208.  
  3209. MXMPLAY_TEXT ends
  3210.  
  3211. end